signal函數的原型是:
void (*signal(int signum, void (*handler)(int)))(int);
參數說明:
signum:指定的信号
其中函數指針handler的取值:
SIG_IGN 忽略該信号
SIG_DFL 采用系統預設方式處理信号
自定義的信号處理函數指針
其中的參數SIG_IGN和SIG_DFL是這樣定義的:
而__sighandler_t又是按下面的方式定義的:
其中,__signalfn_t又是這樣定義的:
現在知道了,SIG_IGN和SIG_DFL是将1和0強制類型轉換為了函數指針類型。
下面分析一下signal的含義:
首先,先看一下函數指針是怎麼用的:
void fun(int); //聲明一個函數fun
void (*FUN)(int); //聲明一個函數指針變量FUN
那麼 可以有 FUN = fun;(函數指針FUN指向了函數fun)
當加入typedef後,再看下面:
typedef void (*FUN)(int); //此時FUN變成了一個類型,不再是變量,FUN可以用來定義一個函數指針變量
可以這麼用:
FUN p;//等價于 void (*p)(int);
p = fun;
利用FUN我們可以實作對signal的化簡:
FUN signal(int signum, FUN handler);
這下容易了解了:
signal的參數有兩個,一個是整型變量,另一個是函數指針。而signal的傳回值又是一個函數指針,其類型與其第二個參數相同。
signal的傳回值是設定之前信号處理的方式,是一個函數指針。看下面一個例子:
執行結果: