c语言 - 如果不存在目录,POSIX 系统上是否有办法以原子方式创建目录?



是否有办法在POSIX系统上自动创建一个目录,如果它已经不存在?

int fd = open( "/path/to/file", O_CREAT | O_EXCL | O_RDWR, 0644 );

这行不通:

int dfd = open( "/path/to/dir", O_DIRECTORY | O_CREAT | O_EXCL | O_RDWR, 0755 );

在我的Solaris 11和Ubuntu 20.04系统上失败,在Solaris上errno设置为EINVAL,在Ubuntu上设置为ENOTDIR

POSIXopen()文档说明了O_CREAT:

如果文件存在,这个标志没有作用,除了下面O_EXCL的说明。否则,如果没有设置O_DIRECTORY

好吧,它不是一个文件,并且O_DIRECTORY是设置的。

(灵感来自问题竞态状态stat和mkdir-在POSIX中似乎没有任何方法可以自动创建一个不存在的目录。)

为了回答标题中的问题,mkdir会这样做——不需要额外的标志,因为mkdir总是"自动地";当且仅当目录不存在(且路径不是文件)时创建该目录。

从注释来看,似乎您实际上想要自动创建并打开目录,但这似乎是XY问题。为什么,因为你不能在任何情况下打开一个目录写?如果您先创建然后打开目录(非原子),那么在行为上没有区别(也没有竞争条件),就好像在过渡期间,有人删除了目录,打开将失败。

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

相关内容

  • 没有找到相关文章

最新更新