[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信号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值