我试图理解标志和模式的文件描述符。
用于的手册页
fcntl - manipulate file descriptor
int fcntl(int fd, int cmd);各国:
文件描述符标志 以下命令操作与文件描述符关联的标志。目前,只定义了一个这样的标志: FD_CLOEXEC、. 文件状态标志 每个打开的文件描述都有某些关联的状态标志,由open (2)初始化。文件状态标志及其语义在开放(2)中描述。
考虑到fcntl完全引用文件描述符(不处理流),我想第二个标题应该是“文件描述符状态标志”。所以现在我们有一个FD“标志”和“状态标志”。此手册页还提到,当cmd=F_GETFL时,fcntl的返回值是“文件访问模式和文件状态标志”。所以现在我们也有了一个文件访问模式。
现在,在open中有标志和模式,好像它们是两个不同的项。甚至有一个原型可以显式的区别。
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是模式,等等。“也许它们是可以互换使用的术语,或者模式是标志的子集,或者.
相关信息:
“文件指针”、“流”、“文件描述符”和.“档案”? (答案在本操作中可能有一个指南,即使不是相同的)。
发布于 2020-05-20 23:11:17
文件描述符可以复制。例如,当进程fork的时候,它得到它自己的一组不受父进程影响的FDs,而dup syscall可以用来显式地复制单个FDs。
当文件描述符被复制时,每个描述符都有自己的一组文件描述符标志,但它们都将共享相同的文件状态标志。例如,考虑以下代码:
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。
发布于 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标志=访问模式+文件创建标志+文件状态标志
请注意:
这是“实体”的基本分类。
备注2:我使用引号,因为通常使用标志是非常误导的。访问模式不是通常意义上的标志,这在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至于罗列每一类别的清单,则由约瑟夫·西布尔-恢复莫妮卡提供。GNU还有自己的接入方式、文件创建标志(开放时间旗)和文件状态标志(运行模式)。
https://stackoverflow.com/questions/61909916
复制相似问题