web-dev-qa-db-ja.com

`cp --no-clobber`は競合状態に対して脆弱ですか?

cp(1) のmanページには、

--no-clobber既存のファイルを上書きしません

しかし、次のシナリオは可能ではないでしょうか?

  1. cpは、ファイルの存在を確認します。ファイルが存在しない(まだ)としましょう。
  2. 他のいくつかのプロセスが同じパスに書き込むため、以前は存在しなかったファイルにデータが書き込まれます
  3. cpは現在存在するファイルを認識していないため、データを上書きします

cp --no-clobberこの競合状態に対して脆弱ですか?そうでない場合、cpは上記の状況をどのように回避しますか?

34
finefoot

cpはこの競合状態に対して脆弱ではありません。いつ --no-clobberが設定されている場合、宛先がすでに存在するかどうかを確認します。そうでないと判断してコピーを続行する必要がある場合は、新しいファイルにコピーする必要があることを記憶しています。宛先ファイルを開くときが来たら、 ファイルの作成を強制するフラグでファイルを開きますO_CREATおよびO_EXCL ;次に、オペレーティングシステムは、ファイルが存在しないことを確認しますファイルを開いている間。存在する場合は失敗します(EEXIST)。

56
Stephen Kitt