fcntl_access.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
//自定义错误处理函数
int my_err(const char *err_string,int line)
{
fprintf(stderr,"line:%d ",line);
perror(err_string);
exit(1);
return 0;
}
int main()
{
int ret;
int access_mode;
int fd;
if((fd=open("example_3.c",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU))==-1)
{
my_err("open",__LINE__);
}
//设置文件打开方式
if((ret=fcntl(fd,F_SETFL,O_APPEND))<0)
{
my_err("fcntl",__LINE__);
}
//获取文件打开方式
if((ret=fcntl(fd,F_GETFL,0))<0)
{
my_err("fcntl",__LINE__);
}
access_mode=ret&O_ACCMODE;
//O_ACCMODE取得文件打开方式的掩码,值为3。做与运算是为了取得ret的最后两位的值
if(access_mode==O_RDONLY)
{
printf("example_3 access mode:read only");
}
else if(access_mode==O_WRONLY)
{
printf("example_3 access mode:write only");
}
else if(access_mode==O_RDWR)
{
printf("example_3 access mode:read*write");
}
if(ret&O_APPEND)
{
printf(",append");
}
if(ret&O_NONBLOCK)
{
printf(",nonblock");
}
if(ret&O_SYNC)
{
printf(",sync");
}
printf("\n");
return 0;
}
dup、dup2函数:
1.原型:
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
2.功能:
利用函数dup,我们可以复制一个文件描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这就意味着,这两个描述符共享所有的锁定、读写指针和各项权限或标志位。例如,如果我们对一个文件描述符执行lseek操作,另一个文件描述符的读写位置也会随着改变。
dup2与dup的区别就是dup2返回的文件描述符可以通过第二个参数“可用的文件描述符”指定。若newfd已经被程序使用,系统就会将其关闭以释放该文件描述符;若oldfd与newfd相等,则dup2返回newfd,而不关闭它。dup2调用成功,返回新的描述符,出错返回-1。
通过dup或dup2函数对标准输入和标准输出的操作来实现Shell中的重定向功能(喵喵喵~T.T不是很懂。。。)
fcntl函数:
1.原型:
#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
2.功能:
用来对已打开的文件描述符进行各种控制操作以改变已打开文件的各种属性。fcntl的功能依据cmd值的不同而不同。
3.参数:
fcntl的功能依据cmd值的不同而不同。
① F_DUPFD:fcntl功能与dup一样,复制由fd指向的文件描述符。
② F_GETFD:获取文件描述符的close-on-exec标志。
③ F_SETFD:设置文件描述符的close-on-exec标志为第三个参数arg的最后一位。
④ F_GETFL:获得文件打开的方式。
⑤ F_SETFL:设置文件打开的方式为arg指定的方式。(O_APPEND/O_NONBLOCK/O_AYNC)