来自标准信号库的C声明
那么有人可以解释这应该做什么:
void (*signal(int sig, void (*func)(int)) ) (int);
它是从标准信号库中获得的定义。
从名称开始:
signal
尽可能向右走:
signal(int sig, void (*func)(int))
你有一个带括号的参数列表,所以它是一个带有2个参数的函数:一个名为sig
的int
和一个名为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
(信号编号)和函数指针并返回函数指针的函数。