【问题标题】:Specification of file descriptors文件描述符规范
【发布时间】:2020-09-06 15:09:39
【问题描述】:

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

The man page

fcntl - manipulate file descriptor

int fcntl(int fd, int cmd);

状态:

文件描述符标志

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

文件状态标志

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

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

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

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

所以现在我们有,对于每个文件描述符,“flags”、“status flags”、“文件访问模式”和“modes”(我认为后两者相同)。 首先,
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 是模式等。” 也许它们是可以互换使用的术语,或者 modeflags 的子集,或者...

相关:

Difference between "file pointer", "stream", "file descriptor" and ... "file"?(回答可能在当前的 OP 中有一个指南,即使不一样)。

How to make sense of O_RDONLY = 0?

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

How to get the mode of a file descriptor?

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-descriptor file-access


    【解决方案1】:

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

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

    标志 = 文件描述符标志 + 非FD标志

    这两组标志之间的区别由 Joseph Sible-Reinstate Monica 给出。

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

    非 FD 标志 = 访问模式 + 文件创建标志 + 文件状态标志

    注意:

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

    2. "这两组标志的区别在于文件创建标志影响打开操作本身的语义,而文件状态标志影响后续 I/O 操作的语义。” [ref]

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

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

    备注3GNU 使用不同的命名,增加了混乱。 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
    

    至于列举每个类别的列表,它们由 Joseph Sible-Reinstate Monica 给出。 GNU 也有自己的Access modes、文件创建标志 (Open-time Flags) 和文件状态标志 (Operating Modes)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 很好的描述。我已经用另一个答案对其进行了补充。
      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 2013-12-27
      • 2021-12-01
      相关资源
      最近更新 更多