【问题标题】:CTRL+C is not killing my programCTRL+C 不会杀死我的程序
【发布时间】:2011-08-07 08:26:11
【问题描述】:

我有一个forks 孩子的程序。 我正在尝试捕捉以下信号:SIGINTSIGPIPESIGTERM

Ctrl+c (生成 SIGINT - afaik)我想确保在主程序终止之前杀死子进程,我正在我的信号处理程序中执行.

现在我的期望/理解是父进程将在 Ctrl+c 时自动被杀死。但这并没有发生。

Ctrl+c 我得到了 shell 提示,但我仍然可以在 ps 中看到我的进程。所以基本上我的主程序没有被杀死。

我的理解有误吗?

Edit 0:一项观察:在 Ctrl+c 之前,ps 主程序状态显示为S,但在 Ctrl+c 它的I

【问题讨论】:

  • 在您的信号处理程序杀死子进程后,它确实调用了“exit”,对吧?
  • 对于 Ctrl+C,您可能根本不需要任何特殊处理,因为此 SIGINT 被发送到终端的前台进程组,其中包括您的子进程,除非您采取措施阻止它。
  • @jilles:哦,是吗?但是我并没有按说创建创建进程组。 CTRL+C 后是否所有子进程都会被清理干净而无需任何特殊工作?
  • 是的,尽管 shell 不会等待它们(因此,如果程序在获得 SIGINT 时生成输出,您可能还是要等待它)。这同样适用于带有% 表示法的kill,但不适用于带有pid 的kill
  • @jilles:“如果程序在获得 SIGINT 时生成输出,您可能还是要等待它” - 我没有得到这部分。我想等什么?让程序完成生成输出?我猜不会。能详细点吗?

标签: c unix signal-handling


【解决方案1】:

它在信号处理程序代码完成运行后被杀死,在您的情况下,它实际上不会死亡,直到您放置在 SIGINT 处理程序代码中的代码执行(如果您正确编写它应该关闭子进程)。

似乎您的处理程序代码执行了不正确的操作,导致进程退出,请发布您的处理程序代码以及如何设置处理程序,因为可以在 SIGINT 上执行 SIGIGN(忽略),以便 CTRL+ C 实际上对您的程序没有任何作用。

确保调用 exit(0) 或 exit(1) 或使用错误代码告诉进程终止,否则进程不会退出。

【讨论】:

  • 感谢耶稣。实际上它会进入信号处理程序并返回并继续。
  • 您是否在子进程成功终止时调用 exit(0)?
  • 我刚刚做了 :D,我意识到我是多么愚蠢。谢谢@selbie 和耶稣。
  • 没问题,很多人都会犯这个错误:)
  • 而不是_exit()(请不要exit(),因为它不是异步信号安全的),最好将信号重置为默认值(signalsigaction),取消阻止它(sigprocmask)并将其重新发送给自己(raise)。这向父进程表明您因信号而退出。然后,shell 可能会中止脚本或复合命令,而不是继续假设中断是在内部处理的。
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多