来自标准信号库的C声明

时间:2010-12-02 07:37:03

标签: c function

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

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

这是从标准信号库中得到的定义。

4 个答案:

答案 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(信号编号)和函数指针并返回函数指针的函数。