我可能有一个“ 无法完成!”问题,我想退出社区。 p>
我正在使用用C编写的libIPFIX程序。在代码开头,该程序设置了Signal Handler函数:
void exit_func ( int signo )
{
if ( verbose_level && signo )
fprintf( stderr, "\n[%s] got signo %d, bye.\n\n", progname, signo );
...clean up global variables...
exit( 1 );
}
稍后在main()中,信号处理程序连接到较大的代码中:
int main (int argc, char *argv[])
{
...
// signal handler
signal( SIGKILL, exit_func );
signal( SIGTERM, exit_func );
signal( SIGINT, exit_func );
...
exit(1);
}
据我所知,很漂亮。
这是我的问题:我正在使用malloc()和链表以及其他功能跟踪程序修改版中的大量额外数据。当代码检测到信号时,如果exit_func()
可以调用我的cleanup()函数来消除内存泄漏,那就太好了。我想要的是这样的:
void exit_func ( int signo, LLNode* myData )
{
...same...
cleanUp( myData );
exit( 1 );
}
但是阅读sigaction以及类似these之类的帖子以及我自己的实验强烈表明,没有一种方法可以向exit_func()
传递附加参数。而要做我想要的唯一方法就是将我的数据变成一个全局变量。由于其他设计原因,我真的很讨厌这样做。
所以我认为我会破产,只是问:是否有办法将参数传递给exit_func()
?预先感谢。
答案 0 :(得分:2)
您不能将参数发送到信号处理程序。需要从处理程序访问的所有内容都必须放入某种全局结构中。
答案 1 :(得分:2)
您的原始代码已经错误 (即使它似乎可以工作;它仍然是undefined behavior)。首先阅读signal (IPC)维基页面。
原始信号处理程序exit_func
已经错误。阅读signal(7)和signal-safety(7)。 exit
和fprintf
都不能调用,甚至不能从信号处理程序中间接调用,因为它们不是异步信号安全的({{1}也不是) )。
最好在信号处理程序中设置一些malloc
变量,并在事件循环中对其进行测试(请参见this和POSIX documentation on signal.h
)。这是通常的做法(一旦这样做,必须遵守volatile sig_atomic_t
和signal(7)
规则,您的问题就变得无关紧要了。
您可能对特定于Linux的signalfd(2)感兴趣(它有一些小缺陷。对于它们来说是STFW)。
Qt文档为Calling Qt functions from Unix signal handlers提供了不错的章节。即使其中的一些智慧(例如,pipe(7)的自欺欺人)也可能适用于您的程序,即使它不使用Qt。