首页 > 解决方案 > 文件描述符规范

问题描述

我正在尝试了解文件描述符的标志和模式。

手册

fcntl - manipulate file descriptor

int fcntl(int fd, int cmd);

状态:

文件描述符标志

以下命令操作与文件描述符关联的标志。目前,只定义了一个这样的标志:FD_CLOEXEC,...

文件状态标志

每个打开的文件描述都有某些相关的状态标志,由 open(2) 初始化...文件状态标志及其语义在open(2)中描述。

鉴于这fcntl完全是指文件描述符(不处理流),我猜第二个标题应该是“文件描述符状态标志”。所以现在我们有一个FD“标志”和“状态标志”。该手册页还提到,当cmd=F_GETFL的返回值为fcntl文件访问模式文件状态标志”。所以现在我们也有了文件访问模式

现在在手册页中openflagspatterns,好像它们是两个不同的项目。甚至还有一个原型可以明确区分

int open(const char *pathname, int flags, mode_t mode);

所以现在我们有,对于每个文件描述符,“标志”、“状态标志”、“文件访问模式”和“模式”(我认为后两者是相同的)。首先,
1.我不知道这三个类别之间的区别

遍历两个引用的手册页,我收集了一个“实体”列表(下面,按照出现的顺序,有些是重复的)。
2.我不知道每个属于哪个类别

FD_CLOEXEC, O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, O_NONBLOCK, O_DSYNC, O_SYNC, O_CLOEXEC
O_CREAT, O_DIRECTORY, O_EXCL, O_NOCTTY, O_NOFOLLOW, O_TMPFILE, O_TRUNC, O_LARGEFILE, O_NDELAY, O_PATH

我找不到一个简单的列表来说明“X、Y、Z 是标志,W、V 是模式等”。也许它们是可以互换使用的术语,或者模式标志的子集,或者......

有关的:

“文件指针”,“流”,“文件描述符”和......“文件”之间的区别?(答案可能在当前的 OP 中有一个指南,即使不一样)。

如何理解 O_RDONLY = 0?

“文件指针”,“流”,“文件描述符”和......“文件”之间的区别?

如何获取文件描述符的模式?

https://www.gnu.org/software/libc/manual/html_node/Access-Modes.html

https://www.gnu.org/software/libc/manual/html_node/File-Status-Flags.html#File-Status-Flags

标签: file-descriptorfile-access

解决方案


文件描述符可以重复。例如,当一个进程forks 时,它会获得自己的一组不受父进程影响的 FD,并且dup系统调用可用于显式复制单个 FD。

当文件描述符重复时,每个描述符都有自己的一组文件描述符标志,但它们都将共享相同的文件状态标志。例如,考虑以下代码:

int fdA = open('/tmp/somefile', O_WRONLY);
int fdB = dup(fdA);
fcntl(fdA, F_SETFD, FD_CLOEXEC);
fcntl(fdA, F_SETFL, O_APPEND);

运行后,fdA将是 close-on-exec 并处于附加模式,并且fdB将处于附加模式但不是 close-on-exec。这是因为 close-on-exec 是一个文件描述符标志,而附加模式是一个文件状态标志。

文件访问模式和文件创建标志在受支持时与文件状态标志一起传递。

的第三个参数open,也容易混淆地称为mode,与目前讨论的所有其他内容无关。如果文件是通过调用创建的open,那么它将mode用作新文件的权限。否则,它没有效果。

  • FD_CLOEXEC- 文件描述符标志
  • O_RDONLY- 文件访问模式
  • O_WRONLY- 文件访问模式
  • O_RDWR- 文件访问模式
  • O_CLOEXEC- 文件创建标志
  • O_CREAT- 文件创建标志
  • O_DIRECTORY- 文件创建标志
  • O_EXCL- 文件创建标志
  • O_NOCTTY- 文件创建标志
  • O_NOFOLLOW- 文件创建标志
  • O_TMPFILE- 文件创建标志
  • O_TRUNC- 文件创建标志

您列出的其余标志是文件状态标志。

最后一点:O_CLOEXEC仅与新的 FD 相关。对于现有的 FD,您永远只能使用FD_CLOEXEC.


推荐阅读