什么是信号
生活当中有很多信号,例如:红绿灯,上课铃声。
本质:操作系统向进程发信号,也就是写信号,是操作系统在修改进程PCB中的位图(进程的PCB中会维护一个数据结构,位图,来存放信号,比特位的位位置代表信号的编号,比特位的内容代表信号有无)。
处理:收到信号不会马上处理,而是在合适的时候
kill -l
查看信号
信号种类 — 62种
两大类:
非可靠信号: 1~31 有可能造成事件丢失(如果进程对某个信号进行处理时,这个信号发生多次,但是进程只处理了一次)
可靠信号: 34 ~64 不会造成事件丢失
信号处理方式
- 忽略此信号
- 执行该信号的默认处理动作
- 捕捉:提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数。
signal
用于信号捕捉,可以修改默认信号
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<signal.h>
4 #include<unistd.h>
6 void handler(int signo)
7 {
8
9 printf("catch sig, signo: %d\n", signo);
10 }
11 int main()
12 {
13 int i = 1;
14 while(i<=31)
15 {
16 signal(i,handler);
17 i++;
18 }
19 while(1)
20 {
21 printf("I am a process...\n");
22 sleep(1);
23 }
但是 19 18 9号信号不可被修改
阻塞信号
block 标明是否被阻塞。阻塞了则为1,未被阻塞则为0。
pending 标明进程是否收到某个信号,收到了则为1,没有收到则为0。
handler 标明对该信号的处理动作。
信号的处理动作分三种:(SIG_IGN)忽略、(SIG_DEL)执行系统默认操作(通常是终止进程)、用户对信号捕捉后进行自定义处理。
信号一旦被阻塞,即使收到该信号,也不会递达。
信号捕捉
内核返回用户时进行信号处理