Linux 产生信号的条件:
1.对于前台进程,用户可以输入特殊的终端字符来给它发送信号,如 ctrl+c
2.系统异常。如浮点异常和非法内存访问
3.系统状态变化。如 alarm 定时器到期引起的 SIGALRM 信号
4.运行 kill 命令或者 kill 函数
信号处理函数是可重入的。
SIG_DEL : 忽略
SIG_IGN : 默认
中断系统调用:
如果程序在执行处于阻塞状态的系统调用时收到信号,并且我们为这信号设置了信号处理函数,
默认情况下,系统调用将被中断,并且设置 errno 为 EINTR 。我们可以使用 sigaction 函数,
为信号设置 SA_RESTART 标志以重启被该信号中断的系统调用。
统一事件源:
把信号的主要处理逻辑放在程序的主循环中,当信号处理函数被触发时,它只是简单的通知主循环接收到信号,
并把信号值传递给主循环,主循环再根据接收到的信号值执行目标信号对应的逻辑代码。
信号处理函数通常使用管道将信号"传递"给主循环:信号处理函数往管道的写端写入信号值,主循环则从管道的读端读出该信号值。
那么,主循环怎么知道管道上何时有数据可读呢?很简单,我们只需要使用IO复用系统调用来监听管道的读端文件描述符上的可读事件。
如此一来,信号事件就能和其他IO事件一样被处理,即统一事件源。
SIGHUP : 对于没有终端的网络后台程序而言,利用 SIGHUP 信号强制服务器重新读取配置文件
SIGPIPE : 往一个读端关闭的管道或socket 连接中写数据将引发 SIGPIPE 信号
SIGURG : Linux 下,内核通知应用程序带外数据到达有2种方式:
一种是 IO 复用技术,select 等系统调用在接收到带外数据时返回,并向应用程序报告 socket上的异常事件。
另外一种方法就是 SIGURG 信号。
10.1 Linux 信号概述
10.2 信号函数
10.3 信号集
10.4 统一事件源
10.5 网络编程相关信号