c - C程序,将参数传递给信号处理函数?
问题描述
我有一个可能的“它无法完成! ”问题,我想从社区中反弹。
我正在使用 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() 和链表之类的程序在我的修改版本中跟踪很多额外的数据。当代码检测到信号时,如果可以调用我的 cleanup() 函数来消除内存泄漏,那就太好了exit_func()
,等等。我喜欢的是这个:
void exit_func ( int signo, LLNode* myData )
{
...same...
cleanUp( myData );
exit( 1 );
}
但是阅读sigaction加上这样的帖子加上我自己的实验强烈表明没有办法将额外的参数传递给exit_func()
. 做我想做的事情的唯一方法就是把我的数据变成一个全局变量。由于其他设计原因,我真的很讨厌这样做。
所以我想我会破产并只是问:有没有办法将论点传递给exit_func()
? 提前致谢。
解决方案
您不能将参数发送到信号处理程序。需要从处理程序访问的任何内容都需要放入某种全局结构中。
推荐阅读
- javascript - React Material UI CardHeader 标题溢出点
- java - 延迟初始化@ManyToMany。错误是什么?
- css - LTR 到 RTL 转换
- excel - 使用 sumif 对 InputBox 中的条件求和范围
- xamarin.forms - 开箱即用的 Xamarin Android 应用在 MainActivity 中显示未定义的 Android.Support、Android.Views、Android.Content
- postgresql - 使用保存在 Postgres 中的 QGIS 项目作为 QGIS 服务器的项目文件
- python - “errorMessage”:“时间数据 '' 与 Lambda 脚本 AWS 中的格式 '%Y-%m-%d %H:%M:%S %Z' 不匹配”
- c# - EF 6,从 DTO 更新实体,但只有现有属性(通用代码)
- spring-boot - 如何在非阻塞线程中同步获取单声道对象?
- java - 我如何摆脱工具栏和回收站视图之间的这种差距?