[Linux]进程信号

0 概述

在这里插入图片描述

  • kill -l 查看信号种类, 共计62个
[test@localhost ~]$ 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 }                             
[test@localhost signal]$ make
gcc mask.c -o mask
[test@localhost signal]$ ./mask 
press enter to continue
^C^C^C^C^C^C^C^C^C^C^C^C^C

[test@localhost ~]$ 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
[test@localhost ~]$ kill -40 5270
[test@localhost ~]$ kill -40 5270
[test@localhost ~]$ kill -40 5270
[test@localhost ~]$ kill -40 5270
[test@localhost ~]$ 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信号

在这里插入图片描述

发布了53 篇原创文章 · 获赞 46 · 访问量 7217

猜你喜欢

转载自blog.csdn.net/new_bee_01/article/details/103543594