所以有人可以解释这应该做什么:
void (*signal(int sig, void (*func)(int)) ) (int);
这是从标准信号库中得到的定义。
答案 0 :(得分:6)
从名称开始:
signal
尽可能向右走:
signal(int sig, void (*func)(int))
你有一个带括号的参数列表,所以它是一个带2个参数的函数:一个名为int
的{{1}}和一个名为sig
的函数指针(你可以用同样的方式分析它)更高版本)。
然后你击中了另一个右翼,所以你向左走:
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
。
是的,这种语言很奇怪,但至少它是一致的。 :)
答案 1 :(得分:5)
函数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
在信号发生时注册要调用的函数,并返回前一个函数处理程序。
答案 2 :(得分:1)
基本上它允许决定如何处理发送到程序的特定信号(由参数int sig
标识)。
void (*func)(int)
是指向将处理信号的函数的指针(您可以提供自定义函数或使用SIG_DFL
SIG_IGN
这些是默认操作来正常管理它或忽略它)。
函数signal
然后在调用此函数或SIG_ERR
发生错误之前返回指向处理程序的指针。当您完成自定义行为时,这可以用于最近恢复默认处理程序。
答案 3 :(得分:0)
通过引入typedef
as:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
sighandler_t
被定义为指向接受int
并返回void
的函数的指针。
signal
是一个接受int
(信号编号)和函数指针并返回函数指针的函数。