C++ 我们可以用mkdir+;重命名并保持原子性?

C++ 我们可以用mkdir+;重命名并保持原子性?,c++,c,unix,posix,atomic,C++,C,Unix,Posix,Atomic,我正在设计一个构建系统,在以原子方式操作文件系统时需要小心 我遇到了这样一种情况:我有一个包含文件的临时目录,现在我想把它移到一个更永久的家中。我知道如何,但如果不存在完整的目标路径,则此操作不起作用。如果我不在乎原子性,答案将是一个简单的mkdir-p…&&mv…。是否可以以创建父目录的方式对临时目录进行原子重命名?我不能提前这样做,因为父目录名是计算出来的 这将在程序内部运行,所以来自生态系统的东西是可取的,但是调用命令行程序或C/C++库来完成这项工作是微不足道的。 示例: /tmp/my

我正在设计一个构建系统,在以原子方式操作文件系统时需要小心

我遇到了这样一种情况:我有一个包含文件的临时目录,现在我想把它移到一个更永久的家中。我知道如何,但如果不存在完整的目标路径,则此操作不起作用。如果我不在乎原子性,答案将是一个简单的
mkdir-p…&&mv…
。是否可以以创建父目录的方式对临时目录进行原子重命名?我不能提前这样做,因为父目录名是计算出来的

这将在程序内部运行,所以来自生态系统的东西是可取的,但是调用命令行程序或C/C++库来完成这项工作是微不足道的。 示例:

/tmp/mytempbuild - a directory containing files
/myproject/build/dev/0.2.2 - the desired destination, whose parent may not exist
/myproject/build/master - an older, existing directory that must not be changed

你不能只在顶层目标目录上执行重命名部分吗?我不能扫描文件系统以查看存在哪些目录,因为这破坏了原子性。我也无法覆盖以前版本中可能存在的同级。我已经更新了问题以澄清问题的限制。您需要围绕多个文件系统操作执行某种互斥。如果
/myproject/build/dev
不存在,您应该能够
mkdir/myproject/build\u tmp/$random
,然后将所有内容放在那里(不必担心此部分的原子性,因为您的其他进程没有从中读取任何内容),然后,在
/myproject/build\u tmp/$random/0.2.2/..
准备就绪后,
mv/myproject/build\u tmp/$random/myproject/build/dev
整个过程以原子方式出现-任何查看
build
的过程都不会看到
dev
,直到整个过程被移动到位。(假设
build
build\u tmp
在同一个文件系统上。如果
build
是一个挂载点,那就更难了。)我也在想类似的事情。但是我不知道
dev
在我尝试把东西放进去之前是不存在的。在这段时间里,我意识到了这一点(通过尝试或使用
stat
等进行检查),然后对其进行更正,任何情况都可能发生。在临时空间中创建缺失的结构(或决定使用哪个级别的结构)实际上只有在读取磁盘状态后的第二个操作才有可能,从而打开通常的磁盘。