2012-02-17 69 views
2

C++: ファイルが別のプロセス/クラス/デバイスから書き込み用に開かれているかどうかを確認する方法はありますか?C++ファイルが使用中であるかどうかをチェックする方法 - マルチスレッドマルチプロセスシステム

他のプロセスからアクセス可能なフォルダからファイルを読み込もうとしています。同時に書き込まれているファイルを読み込んだ場合、読み込みと書き込みの両方のプロセスでエラーが発生します(書き出しが不完全で、ヘッダーしか取得できない場合があります)。 その特定のファイルを開くかどうかを決める前に、ある種の条件をチェックする必要があります。 私はファイルリストを取得するためにboost :: filesystemを使用しています。私はUnixとWindowsの両方との互換性が必要です。

+0

あなたに最も役立つ答えの1つを「受け入れる」ようにしてください。これは、この質問が十分に答えられていることを示しており、回答者には「ありがとう」ということが少しあります。人々は実際に回答を受け入れる人からの質問に答えることを好む。 – jammon

答えて

2

ファイルのアドバイザリロックを使用する必要があります。 Unixでは、これはflock、WindowsではLockFileです。

しかし、あなたのの読書プロセスがエラーを起こしているという事実は、そのプロセスで読取り専用モードでファイルを開かなかったことを示していると考えられます。読取り専用アクセスには正しいフラグを指定する必要があります。また、2つのライターを持つOSの観点から指定する必要があります。

どちらのオペレーティングシステムも、無制限の読者が許可されているが、ライターが存在しない場合にのみ、読者/ライターのロックをサポートしています。一度に最大1人のライターのみがアクセスできます。

(それはプロセス間共有メモリ内でない限り)あなたは、あなたのシステムがマルチプロセス(すなわち、マルチスレッドではない)であると言うので、あなたが条件変数を使用することはできません。ソケットや共有メモリーを介してそこにデータを送っていない限り、コーディネーターとして単一のライターを使用することはできません。

1

私が約boost::filesystemについて理解していることから、あなたが要求しているタスクを実行するために、その機能セットから必要な細分性を得ることはできません。

  1. なPOSIXシステム上の
  2. 使用ファイル・ロック(すなわち、fcntlまたはflockファイル・システム・レベルで可視の名前付きセマフォとして同期メカニズムを使用します。一般的には、あなたが取ることができる2つの異なるアプローチがあります)

残念ながら両方のアプローチは、プラットフォーム固有のものであるか、少なくともPOSIXとWin32の両方に限定されます。

関連する問題