我们一直在用C / Unix覆盖信号,教授在课堂上举了一个令我困惑的例子。在下面的主要方法中,使用包含的参数调用信号函数。
main()
{
signal(SIGALRM, handler); // install handler
handler是一个定义为static void handler(int param){
根据Ubuntu man 7 signal
,SIGALRM是一个整数值14,handler是程序员定义的函数。但是,在信号调用中没有显式定义整数参数,那么处理程序如何接收参数?
修改
感谢您的帮助。绊倒我的真正问题是该类没有覆盖typedef,所以我不知道它是如何被合并到函数中的,这就是缺少的部分。
答案 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
)。这不是一个额外的参数。