「Unixネットワークプログラミング」という本には、このような言葉があります。
ソケット所有者を設定する前に、シグナルハンドラをビルドする必要があります。 Berkeley派生の実装では、基本的な操作はSIGIOを無視するものなので、両方の関数呼び出しの順序は重要ではありません。したがって、2つの関数呼び出しの順序を変更すると、fcntlを呼び出した後に信号が生成される可能性は低くなりますが、これが発生すると信号は削除されます。ただし、SVR4では、SIGIOはヘッダーにSIGPOLLとして定義されており、SIGPOLLのデフォルトの動作はプロセスを終了することです。したがって、SVR4では、ソケット所有者を設定する前にシグナルハンドラがインストールされていることを確認します。
Linuxカーネル文書では、signal.h
System V以降のPOSIXの動作が参照されます。コメントで:
* +--------------------+------------------+
* | POSIX signal | default action |
* +--------------------+------------------+
* | SIGHUP | terminate |
* | SIGINT | terminate |
....
* | SIGPROF | terminate |
* | SIGPOLL/SIGIO | terminate |
* | SIGSYS/SIGUNUSED | coredump |
* | SIGSTKFLT | terminate |
.... etc.
ただし、このポリシーが実際に実装されているソースはどこにもありません。 SIGIOをSIGPOLLと同じに設定する方程式はないようです。それでは、LinuxはBerkeleyの動作に従いますか、またはSystem Vの動作に従いますか?
答え1
#define SIGIO 29
#define SIGPOLL SIGIO
https://github.com/torvalds/linux/blob/v4.12/include/uapi/asm-generic/signal.h#L39