简易编写捕获SIGUSR1和SIGUSR2信号的程序指南
捕捉SIGUSR1和SIGUSR2的简单程序
#include <stdio.h> #include <signal.h> #include <unistd.h> static void sig_usr(int); int main(void) { if(signal(SIGUSR1, sig_usr) == SIG_ERR) printf("can't catch SIGUSR1\n"); if(signal(SIGUSR2, sig_usr) == SIG_ERR) printf("can't catch SIGUSR2\n"); for(; ;) pause(); } static void sig_usr(int signo) { if(signo == SIGUSR1) printf("received SIGUSR1\n"); else if(signo == SIGUSR2) printf("received SIGUSR2\n"); else printf("received signal %d\n", signo); }
运行结果为:
[chinsung@thinkpad apue]$ ./a.out &
[1] 2581
[chinsung@thinkpad apue]$ kill -USR1 2581
received SIGUSR1
[chinsung@thinkpad apue]$ kill -USR2 2581
received SIGUSR2
[chinsung@thinkpad apue]$ kill 2581
[1]+ Terminated ./a.out
说明:
void sig_usr(int)为signal handler函数,用于注册信号,其实现也只是将接收到的信号打印出来而已,对SIGUSR1和SIGUSR2两种信号特别一些,直接打印出其信号名。
在main函数中,先是注册了两个信号:SIGUSR1和SIGUSR2,然后是一个死循环,使用pause不断的接收信号,并没有退出循环的相应机制,只能使用kill命令结束进程。
于是到现在,这个小程序便比较容易理解了,程序先使用signal函数将SIGUSR1和SIGUSR2两个信号注册到sig_usr信号处理函数上去,而信号处理函数sig_usr对信号的处理策略为:如果是SIGUSR1或SIGUSR2两种信号,打印出其信号类型,否则打印其信号值。
无意间,我们已经做了一次进程间通信:执行kill命令的进程将SIGUSR1或SIGUSR2信号传送给了进程id为2581的进程,而进程2581收到信号过后,按照约定(注册的信号处理函数)进行了相应的处理(打印进程信息)。
上一篇: 简单易懂解析差分信号,值得保存的实用指南
下一篇: 理解电子学基础:差分信号与共用信号的区别