我正在努力理解文件描述符的标志和模式。
的手册页
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-状态标志
文件描述符可以重复。例如,当一个进程fork
s时,它会获得自己的一组父级不影响的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_GETFL
0-文件创建标志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标志=访问模式+文件创建标志+文件状态标志
注意:
-
手册页不使用名称非FD标志。它只是简单地调用这个标志,作为所列原型中参数的名称。但从概念上讲,这不应被视为这些标志包含了所有标志,因为文件描述符标志
-
"这两组标志之间的区别在于,文件创建标志影响打开操作本身的语义,而的文件状态标志
-
这是文件状态标志最常见的用法。
这是"实体"的基本分类。
备注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也有自己的访问模式,文件创建标志(开放时间标志)和文件状态标志(操作模式)。