文章目录
一、函数声明
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
//当函数执行失败时返回-1
1.1 cmd可选值
- Duplicating a file descriptor:(复制文件描述符)
- F_DUPFD
- F_DUPFD_CLOEXEC
- File descriptor flags:(文件描述符标志)
- F_GETFD
- F_SETFD
- File status flags(文件状态标志)
- F_GETFL
- F_SETFL
可以通过F_SETTFL修改的只有O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, O_NONBLOCK、O_DSYNC 、O_SYNC
最后这两个可能会修改失败(从https://man7.org/linux/man-pages/man2/fcntl.2.html中得知,具体原因暂未了解)。
注意:
1.文件状态标志并不包括O_CREAT(还有其他三个在下面列出来)。这只是open,打开不存在的文件时,告诉open应该创建该文件。(O_CREAT是为了避免两次系统调用,open和creat非原子性造成的一些问题,而产生)
O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC
2.而且并不是所有的文件状态标志都可以改变,例如
O_RDONLY, O_WRONLY, O_RDWR这三个就不可以修改
(参考自 https://man7.org/linux/man-pages/man2/fcntl.2.html )
Set the file status flags to the value specified by arg. File
access mode (O_RDONLY, O_WRONLY, O_RDWR) and file creation
flags (i.e., O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) in arg are
ignored. On Linux, this command can change only the O_APPEND,
O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK flags. It is not
possible to change the O_DSYNC and O_SYNC flags; see BUGS,
below.
-
Advisory record locking(文件锁相关)
- F_SETLK
- F_SETLKW
- F_GETLK
-
Managing signals (信号管理)
- F_GETOWN
- F_SETOWN
F_GETOWN, F_SETOWN, F_GETOWN_EX, F_SETOWN_EX, F_GETSIG and F_SETSIG
are used to manage I/O availability signals:
二、实例
2.1 F_DUPFD / F_DUP_CLOEXEC(Duplicating a file descriptor)
fcntl(fd, F_DUPFD, newfd);
这里只简单演示使用,F_DUPFD和F_DUP_CLOEXEC的区别在于新产生的文件描述符,是否有CLOEXEC描述符标志。(关于CLOEXEC的作用,可以看我的这篇文章