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 和 Ubuntu 上设置errno
为。EINVAL
ENOTDIR
POSIXopen()
文档说明了这一点O_CREAT
:
如果文件存在,则此标志无效,除非
O_EXCL
如下所述。否则,如果O_DIRECTORY
没有设置...
好吧,它不是一个文件,O_DIRECTORY
而是设置好的。
(受Race condition stat and mkdir问题的启发- 如果目录尚不存在,POSIX 中似乎没有任何方法可以自动创建目录。)
解决方案
要回答您标题中的问题,mkdir 会这样做——不需要额外的标志,因为当且仅当它不存在(并且路径不是文件)时,mkdir 将始终“原子地”创建一个目录。
从评论中,您似乎实际上想要原子地创建和打开一个目录,但这似乎是一个 XY 问题。为什么,因为无论如何您都无法打开目录进行写入?如果您首先创建然后打开目录(非原子地),那么行为没有差异(也没有竞争条件),就好像在此期间有人删除了目录,打开将失败。
如果您担心只在设置了权限的目录中创建文件,这样没有人(其他)可以读取它们,您可以在打开目录后检查目录的权限和所有权(使用 fstat)。
推荐阅读
- firmware - What data are stored in TPM and is it safe to erase them?
- php - PHP MYSQLi 数据库未更新
- php - Laravel,如果请求不为空,则检查条件
- r - 如何为ggplot2中的每个条分别调整值位置?
- azure - 确定在 Azure Log Analytics 工作区上设置的保留期
- python - 将 selenium 驱动程序连接到 CEF 桌面应用程序
- python - 自定义 Keras 层因功能性 API 而失败
- javascript - React js数组中的警告
- java - 用户登录时登录和将用户信息读入文本字段的问题
- android - 在使用 RX 和改造 Android 时处理 PDF 响应