明镜止水,长话短说。
目录
- Linux C++ 通信 - 信号集(信号屏蔽字)的简单认知
- 信号集(信号屏蔽字)的引入
- 对其连续发送相同信号
- 使用不同信号
对于一个进程,收到一个SIGUSR1信号,开始执行对应信号处理函数,尚未执行结束时,突然又收到一个SIGUSR1信号,系统会不会再次执行相应信号处理函数呢?一般不会,也就是说,当收到某个信号时并执行相应信号处理函数时,通常会屏蔽/阻塞其后的相同信号,直到信号处理函数执行完毕。
一样,先来段简单的C++代码:
#include#include #include #include using namespace std; void sig_accept(int sig){ if ( sig == SIGUSR1 ){ printf("收到SIGUSR1信号, 开始休眠5s!n"); sleep(5); printf("SIGUSR1信号, 休眠5s结束!n"); }else if ( sig == SIGUSR2 ){ printf("收到SIGUSR2信号, 开始休眠5s!n"); sleep(5); printf("SIGUSR2信号, 休眠5s结束!n"); }else{ printf("Nothing!n"); } } int main(int argc, char * const * argv){ printf("程序开始执行!n"); if ( signal(SIGUSR1, sig_accept) == SIG_ERR ){ printf("无法捕获SIGUSR1n"); } if ( signal(SIGUSR2, sig_accept) == SIG_ERR ){ printf("无法捕获SIGUSR2n"); } while(1){ sleep(5); printf("进程休眠5s中!n"); } return 0; }
编译执行:
root@ubuntu:/home/qiye# g++ -o t144 /mnt/hgfs/c/t144.cpp root@ubuntu:/home/qiye# ./t144 程序开始执行! 进程休眠5s中!对其连续发送相同信号
root@ubuntu:/home/qiye# ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 'PID|t144'
PID PPID SID TT PGRP COMMAND STAT
25878 2960 2763 pts/0 25878 t144 S+
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye#
其结果为:
root@ubuntu:/home/qiye# ./t144 程序开始执行! 进程休眠5s中! 进程休眠5s中! 收到SIGUSR1信号, 开始休眠5s! SIGUSR1信号, 休眠5s结束! 收到SIGUSR1信号, 开始休眠5s! SIGUSR1信号, 休眠5s结束! 进程休眠5s中! 进程休眠5s中! 进程休眠5s中! 进程休眠5s中!
可以发现,明明发了五次信号,却只是执行两次信号函数
使用不同信号root@ubuntu:/home/qiye# kill -usr1 25878 root@ubuntu:/home/qiye# kill -usr2 25878 root@ubuntu:/home/qiye# kill -usr1 25878 root@ubuntu:/home/qiye# kill -usr1 25878 root@ubuntu:/home/qiye# kill -usr1 25878
其结果:
进程休眠5s中! 进程休眠5s中! 收到SIGUSR1信号, 开始休眠5s! 收到SIGUSR2信号, 开始休眠5s! SIGUSR2信号, 休眠5s结束! SIGUSR1信号, 休眠5s结束! 收到SIGUSR1信号, 开始休眠5s! SIGUSR1信号, 休眠5s结束! 进程休眠5s中! 进程休眠5s中! 进程休眠5s中! 进程休眠5s中!
结论:
- 进程收到一个信号执行信号函数尚未结束时,系统会自动建立这个信号的信号屏蔽字,再收到一个相同信号,会将其阻塞到对前一个信号的处理结束为止;而不同信号却不会,因为没有对应的信号屏蔽字,所以可以直接执行相应信号处理函数。
- 当一个信号拥有信号屏蔽字时,无论再收到多少个相同信号,到最后都只会阻塞成一个。
- 信号执行和退出有一个先后顺序问题,好比栈结构,后收到的信号,对应的信号处理函数先结束。



