来自标准信号库的 C 声明

Posted

技术标签:

【中文标题】来自标准信号库的 C 声明【英文标题】:C declaration from standard signal Library 【发布时间】:2010-12-02 07:37:03 【问题描述】:

那么有人可以解释一下这是做什么的吗:

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

这是从标准信号库中获取的定义。

【问题讨论】:

【参考方案1】:

以名字开头:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

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

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

【讨论】:

以上是关于来自标准信号库的 C 声明的主要内容,如果未能解决你的问题,请参考以下文章

没有收到来自父进程的信号

Python标准库07 信号 (signal包,部分os包)

准确处理来自父进程的SIGUSR1类型的所有信号。 C

Linux 信号表

Linux 信号表

将插槽连接到来自类派生的所有对象的信号