file-descriptor - 文件描述符规范
问题描述
我正在尝试了解文件描述符的标志和模式。
手册页
fcntl - manipulate file descriptor
int fcntl(int fd, int cmd);
状态:
文件描述符标志
以下命令操作与文件描述符关联的标志。目前,只定义了一个这样的标志:FD_CLOEXEC,...
文件状态标志
每个打开的文件描述都有某些相关的状态标志,由 open(2) 初始化...文件状态标志及其语义在open(2)中描述。
鉴于这fcntl
完全是指文件描述符(不处理流),我猜第二个标题应该是“文件描述符状态标志”。所以现在我们有一个FD“标志”和“状态标志”。该手册页还提到,当cmd=F_GETFL
的返回值为fcntl
“文件访问模式和文件状态标志”。所以现在我们也有了文件访问模式。
现在在手册页中open
有flags和patterns,好像它们是两个不同的项目。甚至还有一个原型可以明确区分
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 是模式等”。也许它们是可以互换使用的术语,或者模式是标志的子集,或者......
有关的:
“文件指针”,“流”,“文件描述符”和......“文件”之间的区别?(答案可能在当前的 OP 中有一个指南,即使不一样)。
“文件指针”,“流”,“文件描述符”和......“文件”之间的区别?
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
解决方案
文件描述符可以重复。例如,当一个进程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
将是 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
.
推荐阅读
- javascript - 即使使用发射,Vue内联模板也不会触发方法
- javascript - Javascript 将 vw 转换为 vh
- hadoop - 在 Hadoop 3.1.0 中,namenode 工作但 datanode 不工作
- mongodb - Mongodb - db.shutdownserver() 不工作。授权错误
- pandas - 如果在行中找到特定字符串,则拆分 CSV(Python/Pandas/Bash)
- azure - Azure 映像实例:凭据被拒绝
- css - 随着页面高度的变化,将侧边栏扩展到全高
- android - 有没有办法从长按 ListViewItem 获取类项(使用自定义适配器)
- unity3d - 如何创建透明 Unity 窗口 + 操作系统的屏幕截图
- user-interface - 将组件添加到附加的 AnchorPane 时,JavaFX Scene Builder 在运行时扩展 ScrollPane 区域