在linux内的信号处理函数中,有#define SIG_DFL ((void(*)(int))0)和#define SIG_IGN ((void(*)(int))1)两个宏定义。要理解这两个宏定义,我们先要知道signal函数的运行机制。首先我们看看该函数的原型声明,如下:
void (*signal (int signr,void (*handler)(int))) (int)


signal函数有两个参数,一个是指定需要捕获的信号signr;另外一个是新的信号处理函数指针void (*handler)(int)。注意,新的信号处理句柄或者说是新的信号处理函数是一个无返回值且具有一个整型参数的函数指针,该整型参数用于当指定信号发生时,内核将其传递给处理句柄(也就是信号处理函数),理解这一点,对于我们理解上述两个宏定义很重要。

signal函数中的信号处理函数handler,可以是用户指定的一个信号处理函数,也可以是内核特定的函数指针SIG_IGN或SIG_DFL。若信号句柄是SIG_IGN或SIG_DFL,则分别表示对捕获的信号采取忽略操作或者默认操作。


从上面signal函数第二个参数的类型:无返回值且具有一个整型参数的函数指针,可知:信号句柄SIG_IGN或SIG_DFL也必须是无返回值且具有一个整型参数的函数指针。下面我只分析#define SIG_DFL ((void(*)(int))0)这个宏定义。


我的理解是((void(*)(int))0)表示一个值为0的无返回值且具有一个整型参数的函数指针,void(*)(int)代表一个无返回值的且具有一个整型参数的函数指针类型(这里是一个空函数),整个语句表示将“0”强制类型转换为无返回值且具有一个整型参数的函数指针。


注:0的意思是SIG_DFL这个常量的值,SIG_IGN为1,SIG_ERR为-1。