文件描述符的规范



我正在努力理解文件描述符的标志和模式。

的手册页

fcntl - manipulate file descriptor
int fcntl(int fd, int cmd);

状态:

文件描述符标志

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

文件状态标志

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

假设fcntl完全引用文件描述符(不处理流),我想第二个标题应该是"文件描述符状态标志"。因此,现在我们有了FD的">标志"one_answers">status标志件访问模式的文件状态标志"。因此,现在我们还有一个文件访问模式

现在在open的手册页中有标志模式,就好像它们是两个不同的项目。甚至有一个原型明确了的差异

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

因此,现在,对于每个文件描述符,我们都有">标志"、">status标志件访问模式"one_answers">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是模式等。"也许它们是可互换使用的术语,或者模式标志的子集,或者。。。

相关:

";文件指针"流"文件描述符";而且"文件";?(答案可能在当前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-状态标志

文件描述符可以重复。例如,当一个进程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将在exec上关闭并处于附加模式,而fdB将在exec上处于附加模式但不关闭。这是因为close-on-exec是一个文件描述符标志,而append模式是文件状态标志。

当支持文件访问模式和文件创建标志时,它们将与文件状态标志一起传递。

open的第三个参数,也被混淆地称为mode,与迄今为止讨论的所有其他参数无关。如果该文件是通过调用open创建的,则该mode将用作新文件的权限。否则,它没有任何作用。

  • FD_CLOEXEC-文件描述符标志
  • O_RDONLY-文件访问模式
  • O_WRONLY-文件访问模式
  • O_RDWR-文件访问模式
  • O_CLOEXEC-文件创建标志
  • O_CREAT-文件创建标志
  • O_DIRECTORY-文件创建标志
  • cmd=F_GETFL0-文件创建标志
  • 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中所引用)标志=文件描述符标志+状态标志strong>备注1:文件状态标志的用法与其他可用信息不一致,因此应该称之为

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

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

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

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

注意:

  1. 手册页不使用名称非FD标志。它只是简单地调用这个标志,作为所列原型中参数的名称。但从概念上讲,这不应被视为这些标志包含了所有标志,因为文件描述符标志

  2. "这两组标志之间的区别在于,文件创建标志影响打开操作本身的语义,而的文件状态标志

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

这是"实体"的基本分类。
备注2:我使用引号,因为一般使用标志会产生误导。访问模式不是通常意义上的标志,这在如何理解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

至于列举每个类别的列表,它们由Joseph Sible Reinstate Monica提供。GNU也有自己的访问模式,文件创建标志(开放时间标志)和文件状态标志(操作模式)。

相关内容

  • 没有找到相关文章

最新更新