2016-06-16 5 views
1

私のアプリケーションではかなり異常な動作が観察されます。存在が確認された直後に、「そのようなファイルまたはディレクトリがありません」と表示されてunlink()が失敗します

私は、以下の機能をしている:

bool File::Exists(const std::string & Path) 
{ 
    struct stat S; 
    if(stat(Path.c_str(), &S) != 0) 
     return false; 

    if(!S_ISREG(S.st_mode)) 
     return false; 

    return true; 
} 

void File::Remove(const std::string & Path) 
{ 
    if(unlink(Path.c_str()) != 0) 
     throw Exceptions::Exception(EXCEPTION_PARAMS, errno); 
} 

私が使用するコードは次のとおりです。

... 
const std::string Path = ...; 
if(File::Exists(Path)) 
    File::Remove(Path); 
... 

そして、この時点で例外がスローされます。

No such file or directory (2) 

主な事実:

  • は一度1K-10Kが削除さ
  • すべてのファイルを約20メガバイト
  • がこれは、アプリケーションのスレッドで呼び出され、バイナリファイルである呼び出しますが、これは(他のスレッド/プロセスがアクセスしない)、それらのファイルにアクセスする唯一のスレッドであるハプンズ。他のプロセス/ユーザー・アクセス・パーティションもありません。
  • ファイルマウントCIFS(SMB)の上に配置されて削除される(ネットワーク)は、マウントポイント

なぜSTAT()レポートファイルは、()、時には失敗存在するが、リンク解除しますか?

答えて

1

これらの呼び出しはどれくらい集中して行われていますか?一度に何千ものファイルを削除しようとしていますか?または1秒間に1秒間、または2秒間に1分間か?ネットワーク上では、「そのようなファイルやディレクトリはありません」と解釈される可能性のあるあらゆる種類のタイムアウトが発生する可能性がありますが、実際には別の問題です。

とにかくそれらを削除しようとしている場合は、どうしてその存在を確認するのが大変ですか?それらを削除し、例外が存在しないかどうか、または異なるエラーがあったかどうかを確認してください。それらが消えてしまったり、とにかく削除できません...

+0

1分ごとに呼び出されるクリーンアップ()ラウンドでは、10個のファイルが削除されます。コンピュータとストレージは1Gbps LANネットワークに接続されています。このプログラムは、ストレージデバイスの唯一のユーザーです。 「No such file ...」と表示された場合、ファイルは実際に削除されているのですか? – peku33

+0

"ファイルは実際に削除されていますか?"通常、はい。しかし、ファイルがあなたから隠されていれば、あなたが懸念している限り、そこには存在しません。それはすべてあなたの許可に依存します。 –

1

なぜstat()レポートファイルは存在しますが、unlink()は失敗することがありますか?

呼び出しが同時に発生しないためです。

このバグは、それがname and even a Wikipedia page独自のを持っているので、一般的です:

ソフトウェア開発で

、使用時のチェックの時間は(TOCTTOUまたは TOCTOUは、「あまりにもタック」と発音)ソフトウェアのバグのクラスであります条件のチェック( セキュリティ資格情報など)とそのチェックの結果の使用との間で、システム内の の変更によって発生します。これは競合状態の一例です です。

+0

これは当てはまりません。 1つのエンティティのみがストレージにアクセスできるため、競合状態は存在しません。 – peku33

+1

@ peku33 * 1つのエンティティだけがストレージにアクセスできます。*明らかにそうではありません。**このバグには名前とウィキペディアのページがあります。**削除前のファイルの存在を確認する*は、役に立たないだけでなく、不完全な競合状態です。もし存在すればどうなりますか?それは読み取り専用のファイルシステムですか?プロセスに削除権限がありますか? *あなたがカーネル*内でアクセスできないために行うデータがないことを確認した*すべてのチェックを再作成しない限り、それは役に立たない。 –

関連する問題