作用:
可以改变已经打开文件的属性
函数原型:
#include<fcntl.h>
Int fcntl(int fd, int cmd,, .., /*int arg*/);
返回值,若成功,则依赖于cmd,若出错,返回-1;
fcntl函数有5种功能:
- 复制一个现有的描述符(cmd=F_DUPFD).
- 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
- 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
- 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
- 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW).
下面四个命令(cmd)有特定的返回值
F_DUPFD,F_GETFD,F_GETFL,F_GETOWN
第一个命令返回新的文件描述符,第2和第3个命令返回相应的标志,这里的相应的标志指的就是open函数中的状态,最后一个命令返回一个正的进程ID或符的进程组ID
例子:
Int val = fcntl(atoi(argv[1], F_GETFL, 0))
中间的参数F_GETFL是有特殊返回值的
这里的val虽然是整形,但是不能直接用
三个访问标志位(O_RDONLY,O_WRONLY和O_RDWR)并不各占一位
这3种标志的值分别是0,1,2,由于历史原因,这三种值是互斥
因此首先必须用屏蔽字O_ACCMODE获取访问模式位,然后将结果与这三种值中的任一种做比较。
访问标志位不止上面这三个,字面这些在open函数中可以设置的参数也可以检测出来
O_APPEND,O_NONBLOCK,O_SYNC,
O_DSYNC,O_RSYNC,O_FSYNC,O_ASYNC
例子
switch(val & O_ACCMODE){
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
printf("unknown access mode");
break;
}
if(val & O_APPEND){
printf(",append");
}
if(val & O_NONBLOCK){
printf(",nonblock");
}
感觉val和一个概念很像,就是管理空闲存储空间的位置图,看哪块被没被占用直接用二进制比较一下就行了,这个也是比较,不过好像具体实现不是这样的,还没来得及细查,留个坑以后填
F_SETFL
然后F_SETFL的时候也是一样的
先获取到原先的val,再把想加的状态“与”进去,最后把新的val设置成文件的状态
int val = fcntl(fd, F_GETFL, 0);
val |= flags;
fcntl(fd, F_SETFL, val);