信号驱动式I/O是指进程预先告知内核,使得当某个描述字上发生某事时,内核使用信号通知相关进程。图1概括展示信号驱动式I/O模型。

【Linux 编程】Linux信号处理

图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 }
View Code

相关文章: