无论如何将参数传递给信号处理程序?

时间:2011-05-03 20:29:40

标签: c

我正在注册SIGTERM的主要处理程序,如下所示:

signal(SIGTERM, sigterm_handler);

处理程序很简单:

void sigterm_handler()
{    exit(1);    }

如果我需要将一些参数传递给处理程序,如2指针或其他什么,该怎么办?如何在信号函数中注册处理程序?或者至少......无论如何都要实现这个目标吗?

注意:该进程被第三方进程杀死,而不是单独进程。但在关闭之前,我需要手动释放一些结构并将其写在文件上。

4 个答案:

答案 0 :(得分:6)

你打算从哪里传递参数?发送信号的唯一时间是做你正在做的事情的合理方式,当你终止的过程是而不是过程本身时,但在这种情况下,指针将毫无意义。你可以传递一个带有sigqueue函数和SA_SIGINFO类型信号处理程序的指针,但它看起来像你不理解信号或者首先使用它们有任何合理的理由。当你想要退出而不是提出信号时,只需进行一次函数调用......

答案 1 :(得分:3)

只需使用全局变量即可。正如其他人所指出的那样,您的信号处理程序将由不受您控制的调用堆栈调用。

您可以考虑使用setjmp()longjmp()将控制权从信号处理程序转移到以前执行的代码路径。这种老式的方法对你来说真的很有趣。

答案 2 :(得分:0)

你不能将一个参数传递给处理程序 - 因为你不是那个调用处理程序的人。处理程序将从您控制之外的某个地方调用。

您通过拨打signalsigaction来注册处理程序。

HTH

马里奥

答案 3 :(得分:0)

信号通常是异步的,这意味着不是来自程序中的特定位置,因此您无法正常传递参数。如果我在程序运行时按下control-C,那么信号处理程序应该指向哪些指针?

如果您在程序中构造了一个信号并故意提出它,那么你只能传递有意义的参数(如果C允许它,它不会这样做),在这种情况下你应该调用一个函数。

因此,如果您想在程序中调用某些内容,请使用函数。如果你想要一个被调用的函数,如果有一个外部事件,它将不知道你正在处理什么,请使用信号处理程序。