2

C++: ファイルが別のプロセス/クラス/デバイスによって書き込み用に開かれているかどうかを確認する方法はありますか?

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

4

3 に答える 3

2

ファイル勧告ロックを使用する必要があります。Unix ではflock、Windows では ですLockFile

ただし、読み取りプロセスでエラーが発生しているという事実は、そのプロセスでファイルを読み取り専用モードで開いていないことを示している可能性があります。読み取り専用アクセスの正しいフラグを指定するか、OS の観点から 2 つのライターを指定する必要があります。

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

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

于 2012-02-17T21:59:47.113 に答える
1

私が理解していることboost::filesystemから、要求しているタスクを実行するために、その機能セットから必要な粒度を得ることはできません。一般に、次の 2 つの方法があります。

  1. ファイル システム レベルで表示される名前付きセマフォなどの同期メカニズムを使用する
  2. ファイルロックを使用する (つまり、fcntlPOSIXflockシステム上で)

残念ながら、どちらのアプローチもプラットフォーム固有、または少なくとも POSIX と Win32 に固有のものになります。

于 2012-02-17T21:58:43.743 に答える
1

ここでは、Sutter のアクティブ オブジェクトhttps://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0xを使用して、非常に優れたソリューションを見つけることができます。

これは非常に高度ですが、多くのコアでうまくスケーリングされます。

于 2012-02-17T22:22:05.317 に答える