1.函数原型
#include<fcntl.h>
int fcntl(int fd, int cmd, .../*int arg*/);
返回值:成功依赖于cmd,失败返回-1.
该函数能够改变已经打开文件的属性。
2.cmd相关的介绍
第三个参数通常是根据cmd而来的一个整数。但是后面当我们讨论记录锁的时候,第三个参数时一个指向结构体的指针。
fcntl函数有五种作用。
1.复制一个存在的文件描述符(cmd=F_DUPFD or F_DUPFD_CLOEXEC);
2.获取/设置文件描述符标志(cmd=F_GETFD or F_SETFD);
3.获取/设置文件状态标志(cmd=F_GETFL or F_SETFL);
4.获取/设置同步I/O关系(cmd=F_GETOWN or F_SETOWN);
5.获取/设置记录锁(cmd=F_GETLK ,F_SETLK, or F_SETLKW);
我们下面讨论前面8个cmd。
F_DUPFD:复制文件描述符fd。函数返回值是新的文件描述符,是最小的未打开的文件描述符,并且大于等于第三个
参数。新的文件描述符和fd共享同一个文件表入口。但是新的文件描述符有它自己的文件描述符标志,并
且他的FD_CLOEXEC文件描述符标志被清除了。
F_DUPFD_CLOEXEC:复制文件描述符并且设置FD_CLOEXEC文件描述符标志给新的文件描述符。函数返回新的
文件描述符。
F_GETFD:返回fd文件描述符标志。现在只有一个文件描述符标志:FD_CLOEXEC.
F_SETFD:设置fd文件描述符标志。显得标志值根据第三个参数设置。
F_GETFL:返回fd文件状态标志。
文件状态标志 描述
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
O_EXEC:只可执行
O_SEARCH:只搜索
------------------------------
O_APPEND:文件尾写
O_NONBLOCK:非阻塞模式
O_SYNC:等待写完成(数据和文件属性)
O_DSYNC:等待写完成(仅数据)
O_RSYNC:同步读和写
O_FSYNC:等待写完成(FreeBSD系统和MAXosX)
O_ASYNC:同步I/O(FreeBSD系统和MAXosX)
前面5个模式标志:O_RDONLY,O_WRONLY,O_RDWR,O_EXEC,O_SEARCH并不是分开的bits
因此我们必须用O_ACCMODE掩码来获取文件状态标志并与5个标志为比较。
F_SETFL:将第三个参数的值设置文件状态标志。只有O_APPEND,O_NONBLOCK,O_SYNC,O_DSYNC,O_RSYC,
O_FSYNC和O_ASYNC能够被设置。
F_GETOWN:当受到信号SIGIO和SIGURG的时候获取进程ID和进程组ID。
F_SETOWN:当收到信号SIGIO和SIGURG的时候设置进程ID和进程组ID。正arg表示进程ID,负arg表示进程组ID等于arg绝对值。
fcntl函数的返回值依赖于cmd。所有的cmd失败时候都返回-1,成功时返回值不同。