Gia*_*sio 5 c linux filesystems bsd posix
尽管仔细阅读了相关的标准文档,但在open使用包含标志的系统调用调用系统调用时,我无法理解POSIX兼容系统中的预期行为O_CREAT|O_DIRECTORY.
该标准规定了
如果设置了O_CREAT和O_DIRECTORY 且请求的访问模式既不是O_WRONLY也不是O_RDWR,则结果未指定.
但是它没有指定既没有系统的行为(O_CREAT|O_DIRECTORY|O_WRONLY),也没有(O_CREAT|O_DIRECTORY|O_RDWR).确实(据我所知),行为EISDIR仅适用于现有目录.
在与O_CREATE相关的部分中,标准指定当命名文件不存在时,
如果未设置 O_DIRECTORY ,则应将文件创建为常规文件; [...]
但同样没有说明如果O_DIRECTORY设置也会发生什么.
我看两者的手册页NetBSD的(这臭名昭著非常关心的POSIX兼容)和Linux的(这是一种广泛使用的系统,尽管实际上不是POSIX一个),但我无法找到任何澄清.
说两个标志的使用是否未指定是否正确?如果是这样,最常见的行为是什么?
是否open(name, O_CREAT|O_DIRECTORY, mode) 相当于mkdir任何POSIX兼容的操作系统?
我想你误解了O_DIRECTORY它的意思。不是创建目录,而是确保打开的“文件”open(2)是目录。
O_DIRECTORY
如果路径解析为非目录文件,则失败并将 errno 设置为 [ENOTDIR]。
这正是POSIX记录它的方式(上面引用)。
然而,它没有指定系统的行为,既没有 (O_CREAT|O_DIRECTORY|O_WRONLY) 也没有 (O_CREAT|O_DIRECTORY|O_RDWR)
的行为O_CREAT|O_DIRECTORY|O_WRONLY和O_CREAT|O_DIRECTORY|O_RDWR相当于O_CREAT|O_WRONLY和O_CREAT|O_RDWR
分别设置在路径名(第一个参数打开(2))是一个目录。的存在O_DIRECTORY是为了确保打开的文件是一个目录 - 它不会影响其他任何东西。
说两个标志的使用都未指定是否正确?如果是这样,最常见的行为是什么?
这意味着未指定特定组合 的行为O_CREAT | O_DIRECTORY;并不意味着使用单个标志(有或没有其他标志)是未指定的。
open(name, O_CREAT|O_DIRECTORY, mode) 是否等同于任何 POSIX 兼容操作系统上的 mkdir?
一点也不。这就是为什么它被保留为unspecified。在 Linux 上,绝对不是- 创建了一个常规文件:
当 O_CREAT 和 O_DIRECTORY 都在 flags 中指定并且 pathname 指定的文件不存在时,open() 将创建一个常规文件(即 O_DIRECTORY 被忽略)。
要创建目录,您可以使用mkdir(2).
小智 5
netbsd本身在vn_open中包含以下内容:
if ((fmode & (O_CREAT | O_DIRECTORY)) == (O_CREAT | O_DIRECTORY))
return EINVAL;
Run Code Online (Sandbox Code Playgroud)
因此,与这两者的任何组合都会被直接拒绝。
在 Linux 中,情况有点复杂,但是任何简单的测试都会告诉你,该目录也没有创建,但你最终可以得到一个文件
为了好玩,我还检查了 freebsd,它从来没有最终用 O_DIRECTORY 创建任何东西
如果您正在寻找的是一个可以返回 fd 的 mkdir,那么恐怕没有这样的东西。另一方面,您应该能够使用 O_DIRECTORY 安全地打开您 mkdir'ed 的任何内容。