前面提到了当进程收到了信号后,有三种处理信号的方法:忽略该信号;执行默认动作;捕捉该信号。
捕捉信号 的意思就是当进程收到一个信号时去执行我们指定的动作。signal 函数就是Linux系统提供用来捕捉信号的函数。
========================================================
函数原型:
函数参数:
- signum:捕捉的信号
- handler:收到信号后执行的动作,是个函数指针变量
返回值:
- 调用失败时返回 SIG_ERR
- 调用成功时返回 指向之前的信号处理程序的指针变量
=======================================================
signal 函数的参数handler除了可以是一个函数的地址之外,还可以是两个宏:SIG_IGN和SIG_DEL。
如果传的是 SIG_IGN,那么表示对于 signum 信号的处理方式是忽略该信号(注意不是默认动作中的忽略);SIG_IGN==(void(*)(int))1
如果传的是 SIG_DFL,那么表示对于 signum 信号的处理方式是采用默认动作。SIG_DFL==(void(*)(int))0
=====================================================
当调用exec函数后,进程会将原来应该要捕捉的信号全部修改成为默认动作,而其余信号处理方式保持不变。之所以要这样处理是因为当调用exec函数后,原来进程的代码段、数据段以及堆栈都将会被覆盖,那么原来设置的信号处函数的地址将在exec后失去意义,不能使用。
当使用fork创建一个子进程时,子进程会继承父进程的信号处理方式。
时间: 2024-12-28 12:31:41