天天看點

對信号注冊函數signal的了解1

signal函數的原型是:

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

參數說明:

signum:指定的信号

其中函數指針handler的取值:

SIG_IGN 忽略該信号

SIG_DFL 采用系統預設方式處理信号

自定義的信号處理函數指針

其中的參數SIG_IGN和SIG_DFL是這樣定義的:

對信号注冊函數signal的了解1

而__sighandler_t又是按下面的方式定義的:

對信号注冊函數signal的了解1

其中,__signalfn_t又是這樣定義的:

對信号注冊函數signal的了解1

現在知道了,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的傳回值是設定之前信号處理的方式,是一個函數指針。看下面一個例子:

對信号注冊函數signal的了解1
對信号注冊函數signal的了解1

執行結果:

對信号注冊函數signal的了解1