C程序,将参数传递给信号处理程序函数?

时间:2019-01-22 20:48:17

标签: c parameter-passing signals

我可能有一个“ 无法完成!”问题,我想退出社区。

我正在使用用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()?预先感谢。

2 个答案:

答案 0 :(得分:2)

您不能将参数发送到信号处理程序。需要从处理程序访问的所有内容都必须放入某种全局结构中。

答案 1 :(得分:2)

您的原始代码已经错误 (即使它似乎可以工作;它仍然是undefined behavior)。首先阅读signal (IPC)维基页面。

原始信号处理程序exit_func已经错误。阅读signal(7)signal-safety(7)exitfprintf都不能调用,甚至不能从信号处理程序中间接调用,因为它们不是异步信号安全的({{1}也不是) )。

最好在信号处理程序中设置一些malloc变量,并在事件循环中对其进行测试(请参见thisPOSIX documentation on signal.h)。这是通常的做法(一旦这样做,必须遵守volatile sig_atomic_tsignal(7)规则,您的问题就变得无关紧要了。

您可能对特定于Linux的signalfd(2)感兴趣(它有一些小缺陷。对于它们来说是STFW)。

Qt文档为Calling Qt functions from Unix signal handlers提供了不错的章节。即使其中的一些智慧(例如,pipe(7)的自欺欺人)也可能适用于您的程序,即使它不使用Qt。