标准信号库中的C声明

9
所以,有人能解释一下这个代码的作用吗?
void (*signal(int sig, void (*func)(int)) ) (int);

这是从标准信号库中获取的定义。
4个回答

9

从名称开始:

signal

尽可能向右移动:

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

你有一个带括号的参数列表,因此这是一个接受两个参数的函数:一个名为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的函数的指针。
是的,这种语言很奇怪,但至少它是一致的。 :)

7

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函数可以注册一个函数,当信号发生时会被调用,并返回之前的函数处理器。


1
基本上,它允许决定如何处理发送到程序的特定信号(由参数int sig标识)。 void(*func)(int)是指向将处理该信号的函数的指针(您可以提供自定义功能或使用SIG_DFLSIG_IGN,这是通常管理它或忽略它的默认操作)。
然后,signal函数返回调用此函数之前存在的处理程序的指针,或者如果出现错误,则为SIG_ERR。 这可用于在完成自定义行为后稍后恢复默认处理程序。

0

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

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接