来自标准信号库的C声明

那么有人可以解释这应该做什么:

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

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

从名称开始:

 signal 

尽可能向右走:

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

你有一个带括号的参数列表,所以它是一个带有2个参数的函数:一个名为sigint和一个名为func的函数指针(你可以稍后以相同的方式对它进行分析)。

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

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

所以函数signal返回一个指向……的东西。 让我们取下括号并再次右转,因为我们可以:

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

我们再次使用带括号的参数列表,因此signal返回一个指向函数的指针,该函数将int作为唯一参数。 然后再左转:

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

因此,函数signal返回指向函数的指针,该函数采用int并返回void

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

函数signal作为参数:

 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记录信号发生时要调用的函数,并返回前一个函数处理程序。

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

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

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

手册页通过引入typedef使这个声明更容易理解:

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

sighandler_t被定义为指向接受int并返回void的函数的指针。

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