1. 程式人生 > >linux信號解釋(4)--C語言下的理解

linux信號解釋(4)--C語言下的理解

linux信號 C語言下linux信號理解

上一節中中簡單介紹了信號的處理機制,就是調用函數庫來實現信號的處理,因此,在這節中,介紹在C語言下如何理解信號的處理機制。

創建一個文件signal.c,文件內容如下:(對於學過一下C語言的童鞋來說是不是很熟悉呢)

#include<signal.h> //信號函數庫
#include<unistd.h> //C和C++語言提供對POSIX
#include<stdio.h> //標準的輸入輸出庫
void signalout(int signo) //自定義signalout函數,用於處理signal函數的參數
{
        switch(signo)
        {
                case 1: //信號1SIGHUP
                printf("Get a signal -- SIGHUP\n");
                break;
                case 2: //信號SIGINT
                printf("Get a signal -- SIGINT\n");
                break;
                case 3: //信號SIGQUIT
                printf("Get a signal -- SIGQUIT\n");
                break;
                default:
                printf("error\n");
                break;
        }
}
int main()
{
        printf("process ID is %d\n",getpid()); //調用unistd.h函數庫中的getpid函數獲取當前進程ID
        signal(1,signalout); //寫法有兩種,一種是寫信號數字
        signal(SIGINT,signalout); //另一種寫法是寫信號名稱
        signal(SIGQUIT,signalout); //調用前面自定義的signalout函數處理信號
        for(;;); //寫一個死循環,目的是使這個進程一直在運行,以便捕捉信號
        return 0;
}

題外講解,signal()函數:
函數原型:
void (signal(int signum,void( handler)(int)))(int) 或 typedef void (*sig_t)( int ) 或 sig_t signal(int signum,sig_t handler)
參數說明:
第一個參數signum指明了所要處理的信號類型,它可以取除了SIGKILL和SIGSTOP外的任何一種信號
第二個參數handler描述了與信號關聯的動作,它可以取以下三種值:
(1)一個無返回值的函數地址
此函數必須在signal()被調用前申明,handler中為這個函數的名字。當接收到一個類型為signum的信號時,就執行handler 所指定的函數。這個函數應有如下形式的定義:

void func(int sig);
(2)SIG_IGN
這個符號表示忽略該信號,執行了相應的signal()調用後,進程會忽略類型為sig的信號。
(3)SIG_DFL
這個符號表示恢復系統對信號的默認處理。

保存編輯的文件後執行#gcc signal.c -o signal,編譯生成可執行二進制文件signal。(在這裏我們就學習了如何在linux下進行C語言編寫啦^_^)
技術分享圖片

接著我們運行二進制文件#./signal
技術分享圖片

在另外一個terminal中發送信號
技術分享圖片
技術分享圖片

目前按ctrl+c是無法終止當前進程的了。想要終止進程只能通過SIGKILL信號來實現(因為之前說過SIGKILL和SIGSTOP信號是無法被捕捉的嘛)

#kill -9 22822
技術分享圖片

linux信號解釋(4)--C語言下的理解