首先明确信号是一种软中断。在操作系统中,当产生了一个信号,内核有三种方式处理该信号。
1、执行默认操作。对于大部分的信号,系统默认操作都是终止进程。
2、丢弃。意味着信号虽然产生,但是被内核丢弃,没有递送给进程。
3、捕捉。内核将调用用户处理函数(捕捉函数)。
下面讲讲信号捕捉。最简单的是signal函数,函数原型如下:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
函数要求两个参数,第一个是整型,指某个信号量,第二个参数是函数指针。函数指针指向的函数返回值为空,形参为整型。
如果希望内核忽略信号,则第二个参数设置为SIG_IGN。
如果希望执行默认操作,第二个参数设置为SIG_DFL。
如果我们希望能够自己处理信号,则将第二个参数指向我们的函数。
下面为测试代码
#include "apue.h"
typedef void Sigfun(int);
void sig_usr(int signo){
if(signo == SIGUSR1)
printf("receive SIGUSR1\n");
}
int
main(int argc,char **argv)
{
if(signal(SIGUSR1,sig_usr) == SIG_ERR)
perror("signal error");
while(1);
return 0;
}
程序将一直循环等待信号的发生。
现在发送信号给进程
进程收到信号,执行捕捉函数,结果如下