三、改变信号的处理函数
进程对信号的处理有默认动作。默认处理是终止进程。
对信号的处理有
3种方式:默认处理,忽略信号,用户自定义
SIG_DFL:默认
SIG_IGN:忽略
doit(这里的名字自己定义,doit只是为了占位):用户自定义的信号处理函数
子进程从父进程继承信号处理函数
bash的信号继承是默认处理(终止进程)
系统提供了signal(
2)用来改变信号的处理函数
#include <signal.h>
typedef void (*sighandler_t)(
int);
sighandler_t signal(
int signum, sighandler_t handler);
功能:
参数:
signum:指定了信号的编号
handler:指定了signum信号的处理函数
SIG_DFL SIG_IGN 用户自定义
返回值:返回的是旧的信号处理函数的地址
SIG_ERR 错误
举例说明:编码实现进程忽略
2号信号,(signal2.c)
#include <signal.h>
int main(
void) {
signal(
2, SIG_IGN);
while(
1);
return 0;
}
tarena@ubuntu:~/day/day32$ a.out
^C^C^C^C^C^C^C^C^\退出 (核心已转储)
分析: 输入ctrl+c是停止不了的 ctrl+\可以终止
这里的
2号信号已经被自定义,相当于忽略
编码实现进程对
2号信号的处理采用用户自定义函数(signal_2u.c)
#include <signal.h>
#include <stdio.h>
void doit(
int n) {
printf(
"recv...%d\n", n);
return;
}
int main(
void) {
signal(
2, doit);
while(
1);
return 0;
}
tarena@ubuntu:~/day/day32$ a.out
^Crecv..
.2
^Crecv..
.2
^Crecv..
.2