実行しているテストで何が起こっているのかを理解するのに苦労しています。テストは、同じマシンで実行される2つのシェルスクリプトです。
A:
#!/bin/bash
touch target;
for ((i=0; i < 1000; i=i+1)); do
echo "snafu$i" > $1/file$i;
mv -f $1/file$i $1/target;
done;
B:
#!/bin/bash
while(true);do
cat $1/target;
done
したがって、A / ext3_dirを実行してから、B / ext3_dir> outを実行します(エラーのみがstd outに送られます)。
これはすべて正常に機能し、「名前の変更」のPOSIX仕様に従って期待どおりに機能します。
新しい引数で指定されたリンクが存在する場合、そのリンクは削除され、古い名前が新しい名前に変更されます。この場合、newという名前のリンクは、名前変更操作の間中、他のプロセスに表示されたままになり、操作が開始される前にnewまたはoldによって参照されたファイルを参照します。
ただし、移動を実行する前に一時ファイルにハードリンクを追加すると、次のようになります。
#!/bin/bash
touch target;
for ((i=0; i < 1000; i=i+1)); do
echo "snafu$i" > $1/file$i;
ln $1/file$i $1/link$i
mv -f $1/file$i $1/target;
done;
読み取り側で「そのようなファイルまたはディレクトリはありません」というエラーが表示されます。これは、POSIX仕様に違反しているようです。
誰かがこの行動に光を当てることができますか?テストは有効ですか?移動するファイルへの追加のリンクを作成すると、移動先から読み取る機能に影響する理由がわかりません。