C 信号处理器问题

C 信号处理器问题,c,linux,signals,C,Linux,Signals,我们一直在讨论C/Unix中的信号,教授在课堂上给出了一个让我困惑的例子。在下面的main方法中,使用包含的参数调用signal函数 main() { signal(SIGALRM, handler); // install handler handler是一个定义为静态无效处理程序(int-param){ 根据UbuntuMan7信号,SIGALRM是一个整数值14,handler是程序员定义的函数。但是,整型参数没有在信号调用中明确定义,那么handler如何接收参数呢 编辑 谢谢

我们一直在讨论C/Unix中的信号,教授在课堂上给出了一个让我困惑的例子。在下面的main方法中,使用包含的参数调用signal函数

main()
{
  signal(SIGALRM, handler);   // install handler
handler是一个定义为
静态无效处理程序(int-param){

根据Ubuntu
Man7信号,SIGALRM是一个整数值14,handler是程序员定义的函数。但是,整型参数没有在信号调用中明确定义,那么handler如何接收参数呢

编辑


谢谢你的帮助。让我绊倒的真正问题是类没有涵盖typedefs,所以我不知道它是如何被合并到函数中的,而这正是缺少的部分。

参数是在
signal()
函数的声明中声明的

请参阅,它引用了
中的声明:


您可以对多个信号使用相同的处理程序函数,因此会向处理程序传递信号值(例如,在您的情况下,
SIGALRM
=14)

关于handler参数,它在
信号的签名中明确定义:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

所讨论的参数(
param
在代码中)是信号号(
SIGALRM
)。它不是一个附加参数。

处理程序将被称为以下类型:

(*pointer_to_handler) (param); (*指向处理器的指针)(参数);
传递给signal的“handler”只是一个函数指针,不是调用。稍后会调用它。

我不确定前面的注释是否回答了您的问题。我猜您是在问参数如何到达signal handler。如果是这样:

每个信号处理程序都必须具有相同的签名。它硬编码到内核中,信号处理程序将接受单个int参数,并且没有返回值。您不需要通过
signal()告诉内核
--如何调用处理程序,因为在这件事上你没有选择。当内核决定调用你的信号处理程序时,它已经知道它要发送什么信号。因此它会查找处理程序的地址,然后像这样调用该函数

(*pointer_to_handler) (signal_number);

正如Paul的回答所说。

好的,那么sighandler是指向signum的整数指针,在本例中,SIGALRM?sighandler是指向一个函数的指针,该函数以整数为参数并返回void。这正是我要寻找的。
(*pointer_to_handler) (signal_number);