本文继进程间的通信(一)、(二)继续学习
一、信号
对于 Linux来说,是一个很重要的异步通信概念
1.信号的概述
信号的名字和编号:
每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。
信号名称可以使用kill -l来查看信号的名字以及序号:
信号的处理:
信号的处理有三种方法,分别是:忽略、捕捉和默认动作。
- 忽略信号,有两种信号不能被忽略(分别是SIGKILL和SIGSTOP)。因为他们向内核和超级用户提供了进程终止和停止的可靠方法,如果忽略了,那么这个进程就变成了没人能管理的的进程,显然是内核设计者不希望看到的场景。忽略信号的宏(SIG_IGN)
- 捕捉信号,需要告诉内核,用户希望如何处理某一种信号,说白了就是写一个信号处理函数,然后将这个函数告诉内核。当该信号产生时,由内核来调用用户自定义的函数,以此来实现某种信号的处理。(经常使用)
- 系统默认动作,对于每个信号来说,系统都对应由默认的处理动作,当发生了该信号,系统会自动执行。
使用信号:
如杀死进程:
kill 9 进程ID号
2.信号的编程
信号处理函数的注册,分为入门版和高级版
- 入门版:函数signal
sighandler_t signal(int signum, sighandler_t handler);
参数解释:
signum:捕捉哪一个信号
handler:函数指针(typedef void (*sighandler_t)(int);)
#include <stdio.h>
#include <signal.h>
void handler(int signum)
{
printf("获取的signum =%d", signum);
switch(signum){
case 2:
printf("SIGINT\n");
break;
case 9:
printf("SIGKILL\n");
break;
case 10:
printf("SIGUSR1\n");
break;
}
printf("绝不退出\n");
}
int main()
{
signal(SIGINT, handler);
signal(SIGKILL, handler);
signal(SIGUSR1, handler);
while(1);
return 0;
}
运行结果:
结论:SIGKILL不会轻易被我们捕捉到
- 高级版