シンボリックリンクはアトミックに変更する必要があります。あなたがそれらを書いている途中である場合、彼らは動作しません。シンボリックリンクの内容は非常に小さい(Linuxでは最大4095文字:ファイルへのパスの最大長)ため、カーネルレベルでシンボリックリンクの一部を編集する意味はほとんどありません。したがって、カーネルは、シンボリックリンクを編集するためのインターフェイスを提供せず、新しいリンクを作成するためのインターフェイス、symlink
システムコール(およびunlink
ファイルを削除するための汎用インターフェイス)のみを提供します。
symlink
システムコールは、唯一の新しいシンボリックリンクを作成し、それが既存のファイルを削除しません。これは迷惑ですが、open
(新しいファイルを作成したり、既存のファイルを切り捨てることはできますが、既存のファイルを新しく作成したファイルで置き換えることはできません)やなどのファイルを作成する他のシステムコールと一致しますmkdir
。
シェルでは、発見したように、シンボリックリンクをln
コマンドでアトミックに置き換えることはできませんが(ln -sf
前のファイルをリンク解除してからシンボリックリンクを作成します)、最初に一時的な名前でシンボリックリンクを作成し、その後、所定の位置に移動します。
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"