如果目录不存在,是否可以在 POSIX 系统上自动创建目录?

And*_*nle 7 c posix

POSIX 系统上是否有任何方法可以仅在目录不存在时自动创建目录?

相似

int fd = open( "/path/to/file", O_CREAT | O_EXCL | O_RDWR, 0644 );
Run Code Online (Sandbox Code Playgroud)

这不起作用:

int dfd = open( "/path/to/dir", O_DIRECTORY | O_CREAT | O_EXCL | O_RDWR, 0755 );
Run Code Online (Sandbox Code Playgroud)

失败对我的Solaris 11和Ubuntu 20.04系统errno设置为EINVAL在Solaris和ENOTDIRUbuntu上。

POSIXopen()文件指出此为O_CREAT

如果文件存在,则此标志无效,除非O_EXCL如下所述。否则,如果O_DIRECTORY没有设置...

嗯,它不是一个文件,并且O_DIRECTORY已经设置好了。

(受到问题Race condition stat 和 mkdir 的启发- 如果目录尚不存在,POSIX 中似乎没有任何方法可以自动创建目录。)

Chr*_*odd 5

为了回答标题中的问题, mkdir 这样做——不需要额外的标志,因为 mkdir 总是“原子地”创建一个目录,当且仅当它不存在时(并且路径不是文件)。

从评论来看,您似乎实际上想要自动创建并打开一个目录,但这似乎是一个 XY 问题。为什么,因为在任何情况下都无法打开目录进行写入?如果您首先创建然后打开目录(非原子地),则行为没有差异(并且没有竞争条件),就好像在此期间有人删除了目录,打开将失败。

如果您担心只在设置了权限的目录中创建文件,以致没有人(其他)可以读取它们,则可以在打开目录后检查该目录的权限和所有权(使用 fstat)。