3

ローカル ファイル システム上のファイルに頻繁にデータを追加したいと考えています。長時間ブロックせずに、ワーカースレッドを作成せずにこれを行いたいです。Linux カーネル 2.6.18 の場合。

Linux での glibc の POSIX AIO 実装は、ユーザー空間のスレッドプールを作成し、それらのスレッドをブロックしているようです。これは素晴らしいことですが、独自の特別な専用ファイル ブロック スレッドを簡単にスピンオフすることもできます。

そして、Linux カーネル AIO 実装が現在、追加時にブロックされていることを理解しています。私がやりたいのは追加だけです。

O_NONBLOCK でファイルを開くことを検討しており、その後、遅延書き込みのようなものを実行して、EWOULDBLOCK後で書き込みを再試行します。このようなもの:

  1. open(pathname, O_CREAT | O_APPEND | O_NONBLOCK);
  2. 呼び出しwrite()、エラーをチェックEAGAIN | EWOULDBLOCK
  3. の場合EAGAIN | EWOULDBLOCKは、書き込むデータを保存して、write()後でもう一度試してください。

これは良い考えですか?これに実際の利点はありますか?そのファイルに対して開いているファイル記述子を持っているのが私だけで、 awrite()と itを試してみると、後でEWOULDBLOCKそうなる可能性は低くなりEWOULDBLOCKますか? それはありEWOULDBLOCKますか?私write()とそれがそうでない場合、それは迅速に戻るEWOULDBLOCKことを意味しますか?write()

言い換えれば、Linux 2.6.18write()でローカル ファイルへの接続が失敗するのは、正確にはどのような状況でしょうか?EWOULDBLOCK

4

2 に答える 2

3

ローカル ファイル システムについてはよくわかりませんが、マウントされたファイル システム (nfs など) 上のファイルに書き込もうとすると、EWOULDBLOCK が発生することは確かです。ここでの問題は、ファイルを作成/開くたびに特別に確認しない限り、通常、それが本当に「ローカル」ハードディスクであるかどうかわからないことです。これを確認する方法は、もちろんシステムに依存します。

システムが実際の書き込みを行うために追加のスレッドを作成したとしても、このスレッドにはバッファー (無限ではない) があるため、十分に高速に書き込みを行うと、EWOULDBLOCK が発生する可能性があります。

于 2013-01-23T09:30:44.400 に答える
2

...どのような状況で...ローカルファイルへのwrite()はEWOULDBLOCKで失敗します

おそらく、ファイルの状況はありません。write(2)のLinuxのマニュアルページには、ソケットを参照するファイル記述子に対してのみEWOULDBLOCKが返されると記載されています。

EAGAINまたはEWOULDBLOCK
ファイル記述子fdはソケットを参照し、非ブロック(O_NONBLOCK)とマークされており、書き込みはブロックされます。POSIX.1-2001では、この場合にいずれかのエラーを返すことができ、これらの定数が同じ値である必要はないため、ポータブルアプリケーションは両方の可能性をチェックする必要があります。

明らかに、この動作は、ソケットがレコードロックを使用するのに対し、単純なファイルは使用しないという事実に関連しています。

于 2013-01-24T09:08:10.283 に答える