mkdir -p 并行化安全吗?

mkdir -p 并行化安全吗?

我正在编写这样的 Makefile 规则:

out/%.x: ...
    mkdir -p $(@D)/
    ...

我打算并行化这个Makefile(-j),这将mkdir -p同时触发许多。

这安全吗?或者我是否需要通过确保mkdir -p只发生一次来防止出现问题?

笔记与 不同,这mkdir -p不一定是文件系统级别的单个操作mkdir。)

答案1

理由POSIXmkdir

因为如果任何路径组件已经存在,则不会产生错误,因此-p选项对于确保特定目录存在也很有用。

这表明并行使用应该是安全的。考虑到竞争的可能性,我可以理解你的疑虑,所以让我们看看一个实现......

在 GNU 中coreutils,该-p选项最终由mkancesdirs,其中有一个有用的描述,应该可以减轻您的恐惧:

确保 FILE 的祖先目录存在,使用即使两个进程并行执行此函数也应该起作用的算法。

(它不会立即对来自 的错误采取行动mkdir,而是尝试chdir进入每个组件目录,并且只有在失败时才会失败。)

如果你使用 GNU Make,你可以使用它二次扩张以与其他先决条件相同的方式处理目录:

.SECONDEXPANSION:

%/:
        mkdir -p $@

out/%.x: $$(@D)/ ...
        ...

相关内容