我试图了解CTRL+如何C终止子进程而不终止父进程。我在某些脚本外壳中看到了这种行为,例如bash您可以在其中启动一些长时间运行的进程,然后通过输入CTRL-终止它,然后C控件返回到外壳。
您能解释一下它是如何工作的,尤其是为什么父(shell)进程不会终止?
外壳程序是否必须对CTRL+C事件做一些特殊处理,如果是,它到底是做什么的?
默认情况下,信号由内核处理。旧的Unix系统有15个信号。现在他们有更多。您可以检查</usr/include/signal.h>(或杀死-l)。CTRL+C是带有名称的信号SIGINT。
</usr/include/signal.h>
CTRL+C
内核中也定义了处理每个信号的默认操作,通常它会终止接收信号的进程。
所有信号(但SIGKILL)都可以由程序处理。
这就是shell的作用:
您也可以为交互式外壳程序设置信号处理,请尝试在您的顶部输入此内容~/.profile。(确保您已经登录并在另一个终端上进行测试-您可以锁定自己)
trap 'echo "Dont do this"' 2
现在,每当您在外壳中按CTRL+C时,它将打印一条消息。不要忘记删除行!
如果有兴趣,可以/bin/sh在此处的源代码中检查原始的旧信号处理。
在上面的注释中有一些错误信息(现已删除),因此,如果对此感兴趣的人是一个很好的链接-信号处理的工作原理。