2

私はサーバー Web を書いています。

各接続は個別のスレッドによって処理されるため、事前にスレッド数がわかりません

テキストファイルのグループもあり (番号もわかりません)、各スレッドは各ファイルを読み書きできます。

ファイルは一度に 1 つのスレッドだけが書き込むことができますが、異なるスレッドが異なるファイルに同時に書き込むことができます。

ファイルが 1 つ以上のスレッドによって読み取られる場合 (読み取りは同時実行可能)、どのスレッドもそのファイルに書き込むことはできません。

今、私はこの(スレッドセーフなマルチファイル書き込み)ソリューションに気付きましたが、たとえば fgets() などの関数も使用したいと思います。

では、ファイルをflock()してから fgets() または別の stdio 読み取り/書き込みライブラリ関数を使用できますか?

4

1 に答える 1

2

まず、fcntlではなくを使用しますflock。後者は非標準の非推奨の BSD 機能であり、NFS やその他のファイルシステムでは機能しません。fcntl一方、ロックは POSIX 標準であり、どこでも機能することを意図しています。

ファイル レベルのリーダー/ライター ロックを stdio と組み合わせて使用​​する場合は機能しますが、バッファリングによってロックに関する想定が崩れないように注意する必要があります。これから説明する方法は唯一のものではありませんが、それが最も明確で簡単だと思います。

stdio を使用してファイルの 1 つを操作したい場合は、正しいタイプのロック (読み取りまたは書き込み、別名共有または排他) を取得する必要がありますfopenfilenoファイル記述子番号を取得し、それにロックを適用するために使用します。その後、読み取りまたは書き込み操作全体を実行します。ファイルのロックを解除しようとしないでください。代わりに、 を呼び出しfcloseてファイルを閉じ、閉じたときに暗黙的にロックを解除します。そうしないと、バッファリングされていないデータがまだ書き込まれていない間にロックを解放したり、ロックが解放される前にバッファリングされたデータを後で読み取ったりする可能性があります。これは、ロックが解放された後は無効になります。

于 2012-04-21T15:29:29.683 に答える