0

これは、コーディングの問題というよりは設計上の問題です。多くの子を分岐させる親プロセスがあります。それぞれの子は、同じテキスト ファイルを読み書きすることになっています。

どうすればこれを安全に達成できますか?

私の考え:

親にファイル ポインタを作成し、その上にバイナリ セマフォを作成します。また、プロセスはファイル ポインタの取得とファイルへの書き込みで競合します。読み取りの場合、セマフォは必要ありません。

間違っていたら教えてください。

LinuxでCを使用しています。ありがとうございました。

4

2 に答える 2

1

POSIX システムにはfcntl、 および/またはを使用したカーネル レベルのファイル ロックがありますflock。それらの歴史は少し複雑であり、その使用法とセマンティクスは必ずしも明らかではありませんが、特に単純なケースでは機能します。ファイル全体をロックするには、 flockIMO を使用する方が簡単です。ファイルの一部のみをロックする必要がある場合fcntlは、その機能を提供します。

余談ですが、NFS を介したファイル ロックは、すべての (ほとんどの?) プラットフォームで安全ではありません。

man 2 flock

man 2 fcntl

http://en.wikipedia.org/wiki/File_locking#In_Unix-like_systems

また、ファイル ロックは「推奨」に過ぎないことにも注意してください。ロックの取得をバイパスしても、ファイルへの書き込み/読み取り/などを実際に妨げることはありません。

于 2013-03-11T20:06:43.517 に答える
0

ライターがファイルにデータを追加している場合、(少なくともファイル システムに対してファイルが大きくなりすぎるまでは) あなたのアプローチは問題ないようです。

ライターがファイルの置き換えを行っている場合、私は次のようにアプローチします。

  • fstat()読み取り API は、キャッシュされた値に対して( を使用して) 最後に変更された時刻をチェックします。時刻が変更された場合、読み取りが実行される前に、ファイルが再度開かれ、キャッシュされた変更時刻が更新されます。

  • 書き込み API はロックを取得し、一時ファイルに書き込みます。次に、 を呼び出して実際のデータ ファイルを置き換えたrename()後、ロックを解除します。

ライターがファイルのどこにでも書き込むことができる場合は、データベースのように、プレーン テキストだけでなく、より構造化されたファイルが必要になるでしょう。このような場合、データの一貫性と完全性を管理するために、ある種のリーダー/ライター ロックを使用する必要があります。

于 2013-03-11T19:46:02.917 に答える