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 系统上失败errno
set to EINVAL
在 Solaris 和ENOTDIR
在Ubuntu上。
The POSIX open()文档 https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html说明这是为了O_CREAT
:
如果文件存在,则此标志无效,除非如下所述O_EXCL
以下。否则,如果O_DIRECTORY
未设置...
嗯,这不是一个文件,而且O_DIRECTORY
is set.
(受到问题的启发竞态条件统计和 mkdir https://stackoverflow.com/questions/66482526/race-condition-stat-and-mkdir- POSIX 中似乎没有任何方法可以自动创建目录(如果目录尚不存在)。)
为了回答标题中的问题, mkdir 这样做——不需要额外的标志,因为 mkdir 总是“原子地”创建一个目录,当且仅当它不存在时(并且路径不是文件)。
从评论来看,您似乎确实想原子地创建and open一个目录,但这似乎是一个 XY 问题。为什么,因为在任何情况下都无法打开目录进行写入?如果您首先创建然后打开目录(非原子地),则行为没有差异(并且没有竞争条件),就好像在此期间有人删除了目录,打开将失败。
如果您担心只在设置了权限的目录中创建文件,以致没有人(其他)可以读取它们,则可以在打开目录后检查该目录的权限和所有权(使用 fstat)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)