すべての例と議論では、BSDソケットプログラミングのコンテキストで実行します。ファイル記述子を非ブロックI/Oモードに設定する推奨方法は、O_NONBLOCK
フラグをfcntl()
に設定します。私は10年以上にわたってUNIXネットワークプログラミングを行ってきたし、常にこれを行うにはFIONBIO ioctl()
コールを使用していたUNIXノンブロッキングI/O:O_NONBLOCK対FIONBIO
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
は本当に理由に多くの思考を与えたことはありません。そのように学んだだけです。
いずれかの可能なそれぞれのメリットについて解説している人はいますか?私は可搬性の軌跡が幾分異なっていると考えていますが、ioctl_list(2)
が個々のioctl
メソッドのその側面を話していないことをどの程度知っていません。
私はfcntl()に対して2つではなく非ブロッキングモードを有効にするために、1つのシステムコールしか必要としないので、ioctl()を使用する傾向があります。さらに、Windowsのioctlsocket()APIは、この機能のためにioctl()と同等です。 –
nginxはできる場合はこれを行い、 "ioctl(FIONBIO)は単一のシステムコールで非ブロックモードを設定します"というコメントを付けます。今ではaccept2を使用して、接続を受け入れ、同じシステムコールの非ブロックモードにすることができます。 – Eloff