文件描述符的规范

Specification of file descriptors

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

The man page 对于

fcntl - manipulate file descriptor

int fcntl(int fd, int cmd);

状态:

File descriptor flags

The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined: FD_CLOEXEC,...

File status flags

Each open file description has certain associated status flags, initialized by open(2)... The file status flags and their semantics are described in open(2).

鉴于fcntl完全指的是文件描述符(不处理流),我想第二个标题应该是"File descriptor status flags"。 所以现在我们有一个 FD“flags”和“status flags”。 该手册页还提到,当 cmd=F_GETFL 时,fcntl 的 return 值为 "the file access mode and the file status flags"。 所以现在我们还有一个文件访问模式

现在 man page for openflagsmodes,就好像它们是两个不同的项目一样。 甚至还有一个原型可以明确区分

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

所以现在对于每个文件描述符,“flags”、“status flags”、“”文件访问模式”和“模式”(我认为后两者相同)。 首先,
1。不知道这三类有什么区别.

遍历两个引用的手册页,我收集了一个 "entities" 的列表(下面,按照出现的顺序,有些是重复的)。
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 are flags, W, V are modes, etc." 也许它们是可以互换使用的术语,或者 modeflags 的子集,或者...

相关:

Difference between "file pointer", "stream", "file descriptor" and ... "file"?(答案可能在当前 OP 中有指南,即使不相同)。

Difference between "file pointer", "stream", "file descriptor" and ... "file"?

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

文件描述符可以重复。例如,当进程 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.

我将总结 Joseph Sible-Reinstate Monica 的描述,并添加一些关于手册页中可能令人困惑的措辞的评论,这可能是 OP 的原因。

根据 http://man7.org/linux/man-pages/man2/fcntl.2.html 中的标题(在 OP 中引用)Flags = File descriptor flags + 文件状态标志
备注 1文件状态标志 的这种用法与其他可用信息不一致,因此它应该被称为类似

Flags = File descriptor flags + Non-FD flags.

这两组旗帜的区别由约瑟夫Sible-Reinstate莫妮卡.

给出

根据 http://man7.org/linux/man-pages/man2/open.2.html

Non-FD Flags = Access mode + File creation flags + File status flags

注意:

  1. 手册页未使用名称 Non-FD Flags。它只是将此 flags 称为所列原型中的参数名称。但这不应该被视为,从概念上讲,这些 标志 包含所有标志,因为 文件描述符标志 不包括在内。

  2. "The distinction between these two groups of flags is that the file creation flags affect the semantics of the open operation itself, while the file status flags affect the semantics of subsequent I/O operations." [ref]

  3. 这是文件状态标志的最常见用法

这是"entities"的基本分类。
备注 2:我使用引号是因为标志的一般用法具有误导性。 访问模式不是通常意义上的标志,这一点在 How to make sense of O_RDONLY = 0?.

备注3: GNU 使用不同的命名,增加了混乱。 翻译 POSIX.1 <-> GNU 如下所示。 在 GNU 中使用 文件状态标志 可能特别令人困惑。

POSIX.1               GNU
Non-FD Flags*         File Status Flags
Access modes          Access mode
File creation flags   Open-time Flags
File status flags     Operating Modes

至于列举每个类别的列表,它们由约瑟夫Sible-Reinstate莫妮卡给出。 GNU 也有自己的 Access modes, File creation flags (Open-time Flags) and File status flags (Operating Modes).