信号处理程序问题

3

我们一直在讲解C/Unix中的信号,教授在课堂上给出了一个例子,让我感到困惑。在下面的main方法中,使用了signal函数并传入了参数。

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

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

根据Ubuntu man 7 signal,SIGALRM是整数值14,handler是程序员定义的函数。然而,在信号调用中未明确定义整数参数,那么handler如何接收参数呢?

编辑

感谢您的帮助。真正困扰我的问题是,这个类没有涵盖typedefs,所以我不知道它是如何被纳入函数中的,这就是缺失的部分。

5个回答

3
我不确定之前的评论是否回答了你的问题。我猜你正在问参数如何传递给信号处理程序。如果是这样的话:
每个信号处理程序都必须具有相同的签名。内核已经将信号处理程序硬编码为只接受一个int参数且没有返回值。你不能通过signal()告诉内核如何调用处理程序,因为你在这件事上没有选择权。当内核决定调用你的信号处理程序时,它已经知道要发送什么信号。所以它查找处理程序的地址,然后像这样调用该函数:
(*pointer_to_handler) (signal_number);

正如Paul的回答所说。

2

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

关于处理程序参数,它在signal的签名中明确定义:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

好的,所以sighandler是一个整数指针,指向signum,在这种情况下是SIGALRM? - Jason
2
sighandler是一个指向以整数为参数并返回void的函数的指针。 - Benoit Thiery

1

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

请参阅手册页面,它引用了<signal.h>中的声明:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler); 

1
处理程序将会被这样调用:
     (*pointer_to_handler) (param);
你传递给信号的 'handler' 只是一个函数指针,不是一个调用。它会在之后被调用。

0
有争议的参数(您代码中的param)是信号编号(SIGALRM),而不是附加参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接