首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件描述符规范

文件描述符规范
EN

Stack Overflow用户
提问于 2020-05-20 09:44:03
回答 2查看 183关注 0票数 0

我试图理解标志和模式的文件描述符。

用于的手册页

代码语言:javascript
复制
fcntl - manipulate file descriptor

int fcntl(int fd, int cmd);

各国:

文件描述符标志 以下命令操作与文件描述符关联的标志。目前,只定义了一个这样的标志: FD_CLOEXEC、. 文件状态标志 每个打开的文件描述都有某些关联的状态标志,由open (2)初始化。文件状态标志及其语义在开放(2)中描述。

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

现在,在open中有标志和模式,好像它们是两个不同的项。甚至有一个原型可以显式的区别。

代码语言:javascript
复制
int open(const char *pathname, int flags, mode_t mode);

现在,对于每个文件描述符,我们都有“标志”、“状态标志”、“文件访问模式”和“模式”(我认为后两者是相同的)。首先,

1.我不知道这三类之间的区别。

在遍历两个引用的手册页面时,我收集了一个“实体”列表(下面,按照外观顺序,有些是重复的)。

2.我不知道哪一类属于

代码语言:javascript
复制
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是模式,等等。“也许它们是可以互换使用的术语,或者模式是标志的子集,或者.

相关信息:

“文件指针”、“流”、“文件描述符”和.“档案”? (答案在本操作中可能有一个指南,即使不是相同的)。

RDONLY = 0?

“文件指针”、“流”、“文件描述符”和.“档案”?

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

节点/Access-Modes.html

节点/文件-状态-Flags.html#文件-状态-标志

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-20 23:11:17

文件描述符可以复制。例如,当进程fork的时候,它得到它自己的一组不受父进程影响的FDs,而dup syscall可以用来显式地复制单个FDs。

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

代码语言:javascript
复制
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将处于追加模式,而不是关闭-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相关。对于现有的FDs,您将只使用FD_CLOEXEC

票数 1
EN

Stack Overflow用户

发布于 2020-05-22 04:36:56

我将总结约瑟夫·西布尔( Joseph )的描述--恢复莫妮卡的身份,并在手册页上添加一些关于可能令人困惑的措辞的评论,这很可能是操作的原因。

按照http://man7.org/linux/man-pages/man2/fcntl.2.html中的标题(如OP中所引用),flags = File标志+ Flags标志。

备注1:这种文件状态标志的使用与其他可用信息不一致,因此应该将其称为类似于

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

这两组旗帜之间的区别是约瑟夫西布尔-恢复莫妮卡。

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

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

请注意:

  1. 手册页不使用名称非FD标志。它简单地调用此标志,作为所列原型中参数的名称。但是,这不应该被看作是,概念上,这些标志包括所有标志,因为文件描述符标志不包括。
  2. “这两组标志的区别在于文件创建标志影响打开操作本身的语义,而文件状态标志影响后续I/O操作的语义。”[参考]。
  3. 这是最常用的文件状态标志。

这是“实体”的基本分类。

备注2:我使用引号,因为通常使用标志是非常误导的。访问模式不是通常意义上的标志,这在RDONLY = 0?中得到了澄清。

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

代码语言:javascript
复制
POSIX.1               GNU
Non-FD Flags*         File Status Flags
Access modes          Access mode
File creation flags   Open-time Flags
File status flags     Operating Modes

至于罗列每一类别的清单,则由约瑟夫·西布尔-恢复莫妮卡提供。GNU还有自己的接入方式、文件创建标志(开放时间旗)和文件状态标志(运行模式)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61909916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档