【发布时间】:2019-01-22 20:48:16
【问题描述】:
我有一个可能的“无法完成!”问题,我想从社区中反弹。
我正在使用 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()?提前致谢。
【问题讨论】:
-
OT:如果程序仍然终止,为什么还要关心内存泄漏?
-
@4386427 - 好问题。我不知道,我正在尝试坚持最佳实践,并且总是释放我分配的内存。没有其他原因。
-
我无法回答您的明确问题,但据我所知,您无需担心内存泄漏,因为任何现代操作系统都会在程序终止时为您处理“清理”。
-
如果内存真的泄漏了,你无论如何都不能释放它。此外,在信号处理程序中使用 stdio 函数也不安全。这种方式存在未定义的行为。
-
@Pete 这实际上是一种不好的做法。您只是在减慢您的程序并增加维护开销。
标签: c parameter-passing signals