C ++应用程序中的多个信号处理程序

时间:2014-01-06 13:34:29

标签: linux signals handler

我正在研究在Linux上运行的C ++应用程序。该应用程序有几组信号处理程序相互干扰。我的任务是了解如何设置这些处理程序并将它们整理好。我熟悉其中的一些,需要找到所有其他的。我试图在源代码中搜索“signal”和“sigaction”之类的单词,但找不到任何我不知道的处理程序。

找到这些处理程序的其他方法是什么?

有没有办法在运行时查看/跟踪这些处理程序的安装?

3 个答案:

答案 0 :(得分:1)

Is there any way to see/trace installing of those handlers during run time?

您可以在sigaction()函数上设置断点,并在到达断点时打印回溯。

ADDED:如评论所述,某些代码可能会使用signal()函数来设置信号处理程序,因此您也可以跟踪该函数。

答案 1 :(得分:0)

您可以sigaction(2)使用NULLact参数和非NULL第三个oldact参数来查询(即检查)信号处理给定signumsigaction的第一个参数:

 struct sigaction oldactst;
 memset (&oldactst, 0, sizeof(oldactst));
 if (sigaction (signum, NULL, &oldactst))) {
    perror("examining sigaction"); exit (EXIT_FAILURE);
 }
 // do something with oldactst

然后可能使用调试器或dladdr(3)将地址转换为合理的名称....不要忘记将整个应用程序与-rdynamic链接(如果可能的话,将其编译为-g,即有调试信息)......

正如我评论的那样阅读signal(7) ......

另请参阅/proc/self/status/proc/$PID/status(例如proc(5) ...)

答案 2 :(得分:0)

我设法通过创建自己的signal()和sigaction()调用来了解会发生什么。它们只会在调用时打印堆栈跟踪。由于它们出现在我的代码中,它们会影响真实的代码,我可以看到所有设置信号处理程序的地方。我使用backtrace()调用系列进行堆栈打印。 感谢所有帮助过的人。