20

私はnginxでそのようなコードを見ています:

if(fcntl(ngx_processes[s].channel[0], F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) == -1) {
...
if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {
...

fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)ioctl(s, FIOASYNC, &on),aren'tasyncと同じことの違いは何nonblockingですか??

4

1 に答える 1

21

FIOASYNCO_ASYNCファイル記述子のフラグ (通常はopen(2)またはで設定されます) を切り替えます。ファイル記述子が IO の準備ができたときにfcntl(2)、カーネルにプロセスに送信するSIGIOか、プロセスに送信するように要求します。SIGPOLL

O_ASYNCはあまり使用されません:

  • シグナルハンドラで IO を適切に処理することは非常に困難です。それらはできるだけ小さくしておくのが最善です
  • select(2)シグナルはプログラムの制御フローを中断するため、またはなどの標準のシステムコールよりも実行に「コストがかかります」poll(2)
  • シグナルは、他の呼び出しよりも少ない情報を提供します。それらは、準備ができている可能性のある多くの fd に対して、1 つの fd の準備ができていることのみを報告します。

は、fd の準備ができていることをユーザー プロセスに通知O_NONBLOCKしません代わりに、ファイル記述子の読み取りまたは書き込みの準備ができていない場合、およびと同様の呼び出しの動作を変更して、read(2)すぐに戻ります。通常、クライアントまたはサーバーのメインループが特定のピアでブロックされず、すべてのピアが枯渇しないことを保証するために、または同様の呼び出しと組み合わせて使用​​されます。write(2)read(2)write(2)O_NONBLOCKselect(2)poll(2)

于 2011-06-07T02:38:45.153 に答える