#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收到信號事後,按照約定(註冊的信號處理函數)進行了相應的處理(打印進程信息)。小程序