signal函數詳解

 

 

 

c traps and pitfalls 對signal函數解釋得非常詳細。

 

<signal.h> 中

 

void ( *signal( int sig, void (* handler)( int ))) ( int );

int (*p)();

這是一個函數指針, p所指向的函數是一個不帶任何參數, 並且返回值爲int的一個函數.

int (*fun())();

這個式子與上面式子的區別在於用fun()代替了p,而fun()是一個函數,所以說就可以看成是fun()這個函數執行之後,它的返回值是一個函數指針,這個函數指針(其實就是上面的p)所指向的函數是一個不帶任何參數,並且返回值爲int的一個函數.

 

void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函數(它自己是帶兩個參數,一個爲整型,一個爲函數指針的函數), 而這個signal()函數的返回值也爲一個函數指針,這個函數指針指向一個帶一個整型參數,並且返回值爲void的一個函數.

 

在寫信號處理函數時對於信號處理的函數也是void sig_fun(int signo);這種類型,恰好與上面signal()函數所返回的函數指針所指向的函數是一樣的.

 

void ( *signal() )( int );

 

signal是一個函數, 它返回一個函數指針, 後者所指向的函數接受一個整型參數 且沒有返回值, 仔細看, 是不是siganal( int signo, void (*handler)(int) )的第2個參數了, 對了, 其實他所返回的就是 signal的第2個信號處理函數, 指向信號處理函數, 就可以執行函數了( signal內部時, signal把信號做爲參數傳遞給handler信號處理函數, 接着 signal 函數返回指針, 並且又指向信號處理函數, 就開始執行它)

 

那麼,signal函數的參數又是如何呢?signal函數接受兩個參數:一個整型的信號編號,以及一個指向用戶定義的信號處理函數的指針。我們此前已經定義了指向用戶定義的信號處理函數的指針sfp:

 

void (*sfp)(int);

 

sfp 的類型可以通過將上面的聲明中的sfp去掉而得到,即void (*)(int)。此外,signal函數的返回值是一個指向調用前的用戶定義信號處理函數的指針,這個指針的類型與sfp指針類型一致。因此,我們可以如下聲明signal函數:

void (*signal(int, void(*)(int)))(int);

 

同樣地,使用typedef可以簡化上面的函數聲明:

typedef void (*HANDLER)(int);

HANDLER signal(int, HANDLER);

 

 

 

下面來看一個簡單的例子:

 

#include <signal.h>

#include <unistd.h>

#include <stdio.h>

void sigroutine(int dunno) { /* 信號處理例程,其中dunno將會得到信號的值 */

switch (dunno) {

case 1:

printf("Get a signal -- SIGHUP\n ");

break;

case 2:

printf("Get a signal -- SIGINT\n ");

break;

case 3:

printf("Get a signal -- SIGQUIT\n ");

break;

}

return;

}

int main() {

printf("process id is %d\n ",getpid());

signal(SIGHUP, sigroutine); //* 下面設置三個信號的處理方法

signal(SIGINT, sigroutine);

signal(SIGQUIT, sigroutine);

for (;;) ;

}

其中信號SIGINT由按下Ctrl-C發出,信號SIGQUIT由按下Ctrl-發出。該程序執行的結果如下:

localhost:~$ ./sig_test

process id is 463

Get a signal -SIGINT //按下Ctrl-C得到的結果

Get a signal -SIGQUIT //按下Ctrl-得到的結果

//按下Ctrl-z將進程置於後臺

[1]+ Stopped ./sig_test

localhost:~$ bg

[1]+ ./sig_test &

localhost:~$ kill -HUP 463 //向進程發送SIGHUP信號

localhost:~$ Get a signal – SIGHUP

kill -9 463 //向進程發送SIGKILL信號,終止進程

localhost:~$

來自: http://hi.baidu.com/flikecn/blog/item/aa295403302bf29ad53f7c31.html

 

發佈了42 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章