我正在注册SIGTERM的主要处理程序,如下所示:
signal(SIGTERM, sigterm_handler);
处理程序很简单:
void sigterm_handler()
{ exit(1); }
如果我需要将一些参数传递给处理程序,如2指针或其他什么,该怎么办?如何在信号函数中注册处理程序?或者至少......无论如何都要实现这个目标吗?
注意:该进程被第三方进程杀死,而不是单独进程。但在关闭之前,我需要手动释放一些结构并将其写在文件上。
答案 0 :(得分:6)
你打算从哪里传递参数?发送信号的唯一时间是做你正在做的事情的合理方式,当你终止的过程是而不是过程本身时,但在这种情况下,指针将毫无意义。你可以传递一个带有sigqueue
函数和SA_SIGINFO
类型信号处理程序的指针,但它看起来像你不理解信号或者首先使用它们有任何合理的理由。当你想要退出而不是提出信号时,只需进行一次函数调用......
答案 1 :(得分:3)
只需使用全局变量即可。正如其他人所指出的那样,您的信号处理程序将由不受您控制的调用堆栈调用。
您可以考虑使用setjmp()
和longjmp()
将控制权从信号处理程序转移到以前执行的代码路径。这种老式的方法对你来说真的很有趣。
答案 2 :(得分:0)
你不能将一个参数传递给处理程序 - 因为你不是那个调用处理程序的人。处理程序将从您控制之外的某个地方调用。
您通过拨打signal
或sigaction
来注册处理程序。
HTH
马里奥
答案 3 :(得分:0)
信号通常是异步的,这意味着不是来自程序中的特定位置,因此您无法正常传递参数。如果我在程序运行时按下control-C,那么信号处理程序应该指向哪些指针?
如果您在程序中构造了一个信号并故意提出它,那么你只能传递有意义的参数(如果C允许它,它不会这样做),在这种情况下你应该调用一个函数。
因此,如果您想在程序中调用某些内容,请使用函数。如果你想要一个被调用的函数,如果有一个外部事件,它将不知道你正在处理什么,请使用信号处理程序。