最简单的接口是singnal,但signal的函数原型太复杂,可以使用下面的typedef,可以更简单一些。第一个参数signo是信号名,是接收到此信号的时候,要调用的函数地址(包括:SIG_IGN :忽略系统动作,SIG_DFL :系统默认动作, ):
#include <signal.h> typedef void Sigfunc(int); Sigfunc * signal(int , Sigfunc *); //信号处理函数 static void sig_usr(int); int main(void ){ if(signal(SIGUSR1,sig_usr) == SIG_ERR){ err_sys("can't catch err!"); } pause(); }我们在在终端使用:kill USR1 (pid) 进程就会接收到SIG_USR1信号。 signal的缺点:不改变信号的处理方式,就不能确定信号的当前处理方式。而sigaction函数则可以确定一个信号的处理方式,无需改变它。
在早期的时候进程信号可能存在丢失的情况,同时,系统对信号的控制能力也很差,系统通常不具备信号的阻塞能力。后来通过捕捉到信号后,设置信号已经发生的标志位的方式,来进行判断信号是否丢失。
当产生一个信号时,事件可以时硬件异常(除以0)、软件异常(定时器超时)、终端信号、kill函数的发生,内核会在进程中以某种形式设置一个标志。当信号传递过程中,我么称之为信号是未决的。如果有多个信号传给一个进程,PoSIX并没有规定它的顺序。