私は次のように Makefile ルールを書いています:
out/%.x: ...
mkdir -p $(@D)/
...
この Makefile ( -j
) を並列化して、多数mkdir -p
の を同時にトリガーするつもりです。
mkdir -p
これは安全ですか? それとも、一度だけ発生するようにして問題を防ぐ必要がありますか?
(注記これはmkdir -p
、とは異なり、必ずしもファイル システム レベルでの単一の操作ではありませんmkdir
。
答え1
根拠はPOSIXmkdir
言う
パスコンポーネントがすでに存在する場合はエラーが発生しないため、-pこのオプションは、特定のディレクトリが存在することを確認する場合にも役立ちます。
これは、並列使用が安全であることを示しています。競合の可能性を考えると、疑問に思うのは理解できますので、実装を見てみましょう...
GNUではcoreutils
、-p
オプションは次のように処理されます。mkancesdirs
そこには、あなたの不安を和らげるのに役立つ説明があります。
2 つのプロセスがこの関数を並列に実行した場合でも機能するアルゴリズムを使用して、FILE の祖先ディレクトリが存在することを確認します。
( からのエラーにすぐに対処するのではなくmkdir
、各コンポーネント ディレクトリへの を試行しchdir
、それが失敗した場合にのみ失敗します。)
GNU Makeを使用している場合は、二次拡大他の前提条件と同じ方法でディレクトリを処理します。
.SECONDEXPANSION:
%/:
mkdir -p $@
out/%.x: $$(@D)/ ...
...