捕捉SIGUSR1和SIGUSR2的簡單程序

捕捉SIGUSR1和SIGUSR2的簡單程序html

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

相關文章
相關標籤/搜索