信号驱动式I/O是指进程预先告知内核,使得当某个描述字上发生某事时,内核使用信号通知相关进程。图1概括展示信号驱动式I/O模型。
图1 信号驱动式I/O模型
针对一个进程建立一个相关进程的处理函数,需要通过signal()函数来建立。
基本信号:(linux 控制台中输入:man 7 signal)
SIGINT(值为2,默认动作:terminal):Interrupt from keyboard。
SIGTERM(值为15,默认动作:terminal):Termination signal
SIGCHILD(值为20,17,28,默认动作:ignore):child stopped or terminated。
其中,SIGINT信号是由用户按中断键(即DELETE或ctrl+c)时,终端驱动程序产生此信号并发送至前段进程组中的每一个进程。
SIGCHLD信号,在一个进程终止或停止时,将SIGCHLD发送给其父进程。
SIGTERM信号,由kill(1)命令发送的系统默认终止信号。
在系统提供的信号值是从0至31,即4 bytes大小。但是用户可以自己设置超过该范围的信号,通过kill -ith pidno来触发新建立的信号。
利用kill来触发信号处理函数,是因为信号实际上就是一个位数组中相应位来建立是否被触发。例如,sigdelset函数
1 int sigdelset( sigset_t *set, int signo ) 2 { 3 if ( SIGBAD( signo ) ) 4 { 5 errno = EINVAL; 6 return (-1); 7 } 8 9 // 该语句帮助理解sigset_t变量实际上就是一个位数组。 10 *set &= ~(1 << (signo - 1)); 11 12 return 0; 13 }