《Unix网络编程》一书中有这样的说法:
我们应该在设置套接字所有者之前建立信号处理程序。在 Berkeley 派生的实现下,两个函数调用的顺序并不重要,因为默认操作是忽略 SIGIO。因此,如果我们颠倒两个函数调用的顺序,那么在调用 fcntl 之后但在调用 signal 之前生成信号的可能性很小;如果发生这种情况,信号就会被丢弃。然而,在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