[Linux]进程信号
程序员文章站
2022-07-12 12:34:59
...
0 概述
- kill -l 查看信号种类, 共计62个
[aaa@qq.com ~]$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
1 信号的产生
2 信号在进程中的注册
3 信号的注销
4 信号的捕捉处理
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <signal.h>
4 #include <stdlib.h>
5
6 void sigcb(int signum)
7 {
8 printf("recv signum: %d\n", signum);
9 }
10
11 int main()
12 {
13 // signal 修改信号的处理方式
14 // SIG_IGN 忽略处理 SIG_DFL 默认处理方式
15 // signal(SIGINT, SIG_IGN); // 程序运行后ctrl + c 无反应
16
17 signal(SIGINT, sigcb);
18 signal(SIGQUIT, sigcb);
19 // 运行后, ctrl+c 与 ctrl+\都没反应, 因为自定义了处理函数
20 while(1)
21 {
22 printf("hello\n");
23 sleep(1);
24 }
25
26 return 0;
27 }
5 信号的阻塞
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <signal.h>
5
6 void sigcb(int signum)
7 {
8 printf("recv a signal:%d\n", signum);
9 }
10
11 int main()
12 {
13 signal(2, sigcb);
14 signal(40, sigcb);
15
16 // 阻塞所有信号
17 sigset_t set, old;
18 sigemptyset(&set);// 清空信号集合
19 sigemptyset(&old);
20
21 // sigaddset(int signum, sigset_t* set); // 将指定信号添加到信号集合
22 sigfillset(&set); // 将所有信号都添加到set集合中
23 sigprocmask(SIG_BLOCK, &set, &old);// 阻塞所有信号
24
25 printf("press enter to continue\n");
26 getchar(); // 在按下回车之前, 程序卡在这里
27
28 sigprocmask(SIG_UNBLOCK, &set, NULL); // 解除阻塞
29 return 0;
30 }
[aaa@qq.com signal]$ make
gcc mask.c -o mask
[aaa@qq.com signal]$ ./mask
press enter to continue
^C^C^C^C^C^C^C^C^C^C^C^C^C
[aaa@qq.com ~]$ ps -ef | grep mask
test 5270 2828 0 21:19 pts/0 00:00:00 ./mask
test 5280 3659 0 21:19 pts/1 00:00:00 grep --color=auto mask
[aaa@qq.com ~]$ kill -40 5270
[aaa@qq.com ~]$ kill -40 5270
[aaa@qq.com ~]$ kill -40 5270
[aaa@qq.com ~]$ kill -40 5270
[aaa@qq.com ~]$ kill -40 5270
- 按下回车后结果:
recv a signal:40
recv a signal:40
recv a signal:40
recv a signal:40
recv a signal:40
recv a signal:2
6 竞态条件
7 SIGCHLD信号
上一篇: LeetCode 198:House Robber
下一篇: Linux进程信号