2

実行しているテストで何が起こっているのかを理解するのに苦労しています。テストは、同じマシンで実行される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仕様に違反しているようです。

誰かがこの行動に光を当てることができますか?テストは有効ですか?移動するファイルへの追加のリンクを作成すると、移動先から読み取る機能に影響する理由がわかりません。

4

2 に答える 2

2

これは、一部の redhat バージョンで既知の問題であることが判明しました。

https://bugzilla.redhat.com/show_bug.cgi?id=438076

于 2012-03-07T14:57:23.973 に答える
0

Debian で実行しましたが、EXT3 ファイル システムで問題なく動作しました。ここには、機能しないものは何もありません。最小限のスクリプトでテストするために、SH シェルのループを書き直しました。

#!/bin/sh
    touch target
    for i in $(seq 1 999) do
            echo "snafu$i" > $1/file$i;
            ln $1/file$i $1/link$i
            mv -f $1/file$i $1/target
    done

とにかく、それtouch targetはすべきではありませんtouch $1/targetか?

于 2012-03-04T22:24:04.750 に答える