欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Linux]进程信号

程序员文章站 2022-07-12 12:34:59
...

0 概述

[Linux]进程信号

  • 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 信号的产生

[Linux]进程信号

2 信号在进程中的注册

[Linux]进程信号

3 信号的注销

[Linux]进程信号

4 信号的捕捉处理

[Linux]进程信号

  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 信号的阻塞

[Linux]进程信号

  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 竞态条件

[Linux]进程信号

7 SIGCHLD信号

[Linux]进程信号

相关标签: Linux