标准信号库中的C声明

标准信号库中的C声明,c,function,C,Function,那么,有人能解释一下这应该做什么吗: void (*signal(int sig, void (*func)(int)) ) (int); 它是从标准信号库中获取的定义。函数信号采用以下参数: int sig - a signal value void (*func)(int) - a pointer to a function that takes an int and returns void 并返回: void (*)(int) - a function that takes an i

那么,有人能解释一下这应该做什么吗:

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

它是从标准信号库中获取的定义。

函数
信号
采用以下参数:

int sig - a signal value
void (*func)(int) - a pointer to a function that takes an int and returns void
并返回:

void (*)(int) - a function that takes an int and returns void

signal
注册信号出现时要调用的函数并返回上一个函数处理程序。

手册页通过引入
typedef
使此声明更容易理解,如下所示:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);
sighandler\u t
定义为指向函数的指针,该函数接受
int
并返回
void


signal
是一个函数,它接受一个
int
(信号编号)和一个函数指针,并返回一个函数指针。

基本上,它允许决定如何处理发送到程序的特定信号(由参数
int sig
标识)

void(*func)(int)
是指向将处理信号的函数的指针(您可以提供自定义函数或使用
SIG_-DFL
SIG_-IGN
,这是正常管理或忽略信号的默认操作)


然后,函数
signal
返回指向在调用此函数或
SIG_ERR
发生错误之前存在的处理程序的指针。这可用于在最近完成自定义行为后还原默认处理程序。

从名称开始:

signal
尽量向右走:

signal(int sig, void (*func)(int))
您有一个带括号的参数列表,因此它是一个包含两个参数的函数:一个名为
int
sig
函数指针和一个名为
func
的函数指针(您可以稍后以同样的方式对其进行分析)

然后你打了另一个右翼,所以你向左走:

*signal(int sig, void (*func)(int))
因此函数
信号
返回指向。。。某物让我们记下括号,再向右走,因为我们可以:

(*signal(int sig, void (*func)(int)) ) (int)
我们还有一个括号内的参数列表,因此
signal
返回一个指向函数的指针,该函数将
int
作为唯一的参数。然后再向左走:

void (*signal(int sig, void (*func)(int)) ) (int)
因此,函数
signal
返回指向函数的指针,该函数取
int
并返回
void

是的,这种语言很奇怪,但至少是一致的