文章目录
  1. SIGHUP
  2. SIGPIPE
  3. SIGURG

SIGHUP

当挂起进程的控制终端时,SIGHUP信号将被触发。对于没有控制终端的网络后台程序而言,它们通常利用SIGHUP信号来强制服务器重读配置文件。

以xinetd为例,xinetd程序在接收到SIGHUP信号之后将调用hard_reconfig函数;它循环读取/etc/xinetd.d目录下所有的子配置文件,并检测其变化。

具体来说,若某个正在运行的子服务的配置文件被修改以停止服务,则xinetd主进程将向该子服务进程发送SIGTERM信号来结束该子服务;若某个正在运行的子服务的配置文件被修改以开启服务,则xinetd主进程将开启新的socket并将其绑定到该子服务对应的端口上。

SIGPIPE

默认情况下,向一个读端关闭的管道或socket连接中写数据将引发SIGPIPE信号。由于程序接收到SIGPIPE信号的默认行为是结束进程,因此必须在程序中捕获并处理SIGPIPE信号,即使只是忽略它。

首先,程序应该禁止写操作触发SIGPIPE信号(send函数的flag设置为MSG_NOSIGNAL),然后再使用send函数反馈的errno的值是否为EPIPE来判断管道或者socket连接的读端是否已经关闭。

此外,程序还可以通过I/O复用系统调用来检测管道或socket连接的读端是否已经关闭。如使用poll系统调用监听时,当管道的读端关闭时,写端文件描述符上的POLLHUP事件将被触发;当socket连接被对方关闭时,socket上的POLLRDHUP事件将被触发。

SIGURG

在Linux环境下,内核通知应用程序带外数据到达主要有两种方法:(1)使用I/O复用技术,select系统调用在接收带外数据时将返回,并向应用程序报告socket上的异常事件;(2)使用SIGURG信号。