来自标准信号库的 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 个参数的函数:一个名为 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
。
是的,这种语言很奇怪,但至少它是一致的。 :)
【讨论】:
【参考方案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 声明的主要内容,如果未能解决你的问题,请参考以下文章