信号处理问题

时间:2011-03-29 13:52:23

标签: c linux signals

我们一直在用C / Unix覆盖信号,教授在课堂上举了一个令我困惑的例子。在下面的主要方法中,使用包含的参数调用信号函数。

main()
{
  signal(SIGALRM, handler);   // install handler

handler是一个定义为static void handler(int param){

的函数

根据Ubuntu man 7 signal,SIGALRM是一个整数值14,handler是程序员定义的函数。但是,在信号调用中没有显式定义整数参数,那么处理程序如何接收参数?

修改

感谢您的帮助。绊倒我的真正问题是该类没有覆盖typedef,所以我不知道它是如何被合并到函数中的,这就是缺少的部分。

5 个答案:

答案 0 :(得分:3)

我不确定之前的评论是否回答了您的问题。我猜你要求 参数如何到达信号处理程序。如果是这样的话:

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

(*pointer_to_handler) (signal_number);
正如保罗的回答所说的那样。

答案 1 :(得分:2)

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

关于handler参数,它在signal

的签名中明确定义
typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

答案 2 :(得分:1)

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

请参阅manual page,引用<signal.h>声明:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler); 

答案 3 :(得分:1)

处理程序将被调用如下:

     (*pointer_to_handler) (param);

传递给signal的'handler'只是一个函数指针,而不是一个调用。它稍后被称为。

答案 4 :(得分:0)

有问题的参数(代码中为param)是信号编号(SIGALRM)。这不是一个额外的参数。