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)/ ...
        ...

相關內容