Ctrl-C如何终止子进程?

发布于 2021-01-29 17:11:55

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

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

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

关注者
0
被浏览
158
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    默认情况下,信号由内核处理。旧的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在此处的源代码中检查原始的旧信号处理。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看