在ANSI标准中,signal()的声明如下:
void (*signal(int sig,void (*func)(int)))(int),此函数是linux中信号处理函数的原型,由于语法晦涩,很荣幸的也出现在了《C陷阱与缺陷中》,理解的难点在于void ( *signal(xxx) )(int),这里与我们平常看到的void ( *p )(int) 函数指针的写法有差异,关键点在于要把看成*signal(xxx) 整体;
signal是一个函数:
1.它返回一个函数指针void (*p) (int)
2.它的两个参数是一个是int和一个函数指针void (*p) (int)
下面用typedef进行简化:
typedef void(*ptr_to_func)(int);
ptr_to_func signal(int,ptr_to_func);
这样看起来就很好理解啦
网上的一个例子:
#include <stdio.h>
enum { RED, GREEN, BLUE };
void OutputSignal(int sig)
{
printf("The signal you /'ve input is: ");
switch(sig)
{
case RED:
puts("RED!");
break;
case GREEN:
puts("GREEN!");
break;
case BLUE:
puts("BLUE!");
break;
}
}
void ( *signal( int sig, void (*func)(int) ) ) (int)
{
puts("Hello, world!");
func(sig);
return func;
}
int main(void)
{
(*signal(GREEN, &OutputSignal))(RED);
return 0;
}
Output:
Hello, world!
The signal you 've input is: GREEN!
The signal you 've input is: RED!