小编典典

Ctrl-C如何终止子进程?

python

我试图了解CTRL+如何C终止子进程而不终止父进程。我在某些脚本外壳中看到了这种行为,例如bash您可以在其中启动一些长时间运行的进程,然后通过输入CTRL-终止它,然后C控件返回到外壳。

您能解释一下它是如何工作的,尤其是为什么父(shell)进程不会终止?

外壳程序是否必须对CTRL+C事件做一些特殊处理,如果是,它到底是做什么的?


阅读 254

收藏
2020-12-20

共1个答案

小编典典

默认情况下,信号由内核处理。旧的Unix系统有15个信号。现在他们有更多。您可以检查</usr/include/signal.h>(或杀死-l)。CTRL+C是带有名称的信号SIGINT。

内核中也定义了处理每个信号的默认操作,通常它会终止接收信号的进程。

所有信号(但SIGKILL)都可以由程序处理。

这就是shell的作用:

  • 当Shell在交互模式下运行时,此模式具有特殊的信号处理功能。
  • 例如find,运行程序时,shell:
    • fork本身
    • 并为孩子设置默认信号处理
    • 用给定的命令替换孩子(例如,用find)
    • 当您按CTRL+时C,父级外壳将处理此信号,但子级将收到此信号-带有默认操作-终止。(孩子也可以实现信号处理)
      您也可以trap在shell脚本中发出信号…

您也可以为交互式外壳程序设置信号处理,请尝试在您的顶部输入此内容~/.profile。(确保您已经登录并在另一个终端上进行测试-您可以锁定自己)

trap 'echo "Dont do this"' 2

现在,每当您在外壳中按CTRL+C时,它将打印一条消息。不要忘记删除行!

如果有兴趣,可以/bin/sh在此处的源代码中检查原始的旧信号处理。

在上面的注释中有一些错误信息(现已删除),因此,如果对此感兴趣的人是一个很好的链接-信号处理的工作原理。

2020-12-20