C 是否仍然可以将参数传递给信号处理程序?

C 是否仍然可以将参数传递给信号处理程序?,c,C,我正在注册SIGTERM的主处理程序,如下所示: signal(SIGTERM, sigterm_handler); 处理程序是一个简单的: void sigterm_handler() { exit(1); } 如果我需要向处理程序传递一些参数,比如2个指针或其他什么呢?如何在信号函数中注册处理程序?或者至少。。。有没有办法做到这一点 注意:该进程由第三方进程终止,而不是由其自身终止。但是在关闭之前,我需要手动释放一些结构并将它们写入文件。您打算从哪里传递参数?发送信号的唯一合

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

signal(SIGTERM, sigterm_handler);
处理程序是一个简单的:

void sigterm_handler()
{    exit(1);    }
如果我需要向处理程序传递一些参数,比如2个指针或其他什么呢?如何在信号函数中注册处理程序?或者至少。。。有没有办法做到这一点


注意:该进程由第三方进程终止,而不是由其自身终止。但是在关闭之前,我需要手动释放一些结构并将它们写入文件。

您打算从哪里传递参数?发送信号的唯一合理方式是,当终止的进程不是进程本身时,但在这种情况下,指针将毫无意义。您可以使用
sigqueue
函数和
SA_SIGINFO
类型信号处理程序传递指针,但在我看来,您似乎不理解信号,或者一开始就没有充分的理由使用它们。当您想退出时,只需进行函数调用,而不是发出信号……

您不能将参数传递给处理程序,因为您不是调用处理程序的人。处理程序将从您无法控制的位置调用

您可以通过调用
signal
sigaction
来注册处理程序


Mario信号通常是异步的,这意味着不是来自程序中的特定点,因此无法正常传递参数。如果我在程序运行时按下control-C,信号处理程序应该得到什么指针

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


因此,如果您想在程序中调用某些东西,请使用函数。如果您希望在存在外部事件时调用函数,而外部事件对您正在处理的内容一无所知,请使用信号处理程序。

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


您可以考虑使用<代码> SETJMP()/<代码>和<代码> LojJMP()/Case>将控制从您的信号处理程序传递到先前执行的代码路径。这种老派的方法对你来说真的很有趣

也许OP只是希望程序中其他地方的一些指针可供信号处理程序使用,但不是由生成信号的代码指定。如果是这样的话,全局变量就是(丑陋的)解决方案。或者,
SIGTERM
可以通过
sigwait
而不是异步阻止和处理。true,但它们不是参数;-)后期编辑:该进程由第三方进程终止,而不是由其自身终止。但在关闭之前,我需要手动释放一些结构并将它们写入文件。然后,您需要将指向该数据的指针存储在全局变量中,或者阻止信号并使用
sigwait
而不是信号处理程序来处理它。后期编辑:该进程由第三方进程终止,而不是由其自身终止。但在关闭之前,我需要手动释放一些结构并将它们写入文件。@hysoka44:您仍然不能传递任何指针。如果愿意,可以在全局变量中留下指向数据结构的指针。然后,您需要弄清楚您可以在信号处理程序中可靠地执行哪些操作。因为它是异步调用的,所以进程可能在做某事的中间,比如I/O,这很容易使信号处理程序的一部分在数据结构上写出来。或者它可能在堆操作的中间,堆可能不在一致的状态。让信号处理程序可靠地执行任何有用的操作都是困难的。我将使用全局变量。无法防止信号处理程序调用可能留下的不一致状态,对吗?我在想:一旦调用了处理程序,我会检查它是否在调用之前被调用(检查全局int):如果不是,则标记int并返回else,然后执行您需要的操作并退出。在我的主函数中,我可以设置一些“安全点”,检查处理程序是否被调用,如果被调用,则再次调用它(但现在它不会返回,但它将从一开始就执行我需要的操作)。这样我就不会有不满足的状态了。我是带着想象力飞得很高吗?为以后的行动设置一面旗帜是信号处理者可以做的事情。您需要的是一个信号处理程序来设置标志,频繁检查标志,以及一个可以调用的清理和写出函数。仅供参考,不要在信号处理程序中调用exit()-它不是异步信号安全的,因为它会刷新stdio缓冲区。在信号处理程序中使用_exit()。这确实很旧,没有可接受的答案,但有一个新的副本,只是为了重定向我标记为复制的任何读卡器。