我试图了解CTRL+C如何终止子进程,而不是父进程。我在一些脚本shell中看到了这种行为,如bash
在那里,可以启动一些长期运行的进程,然后通过输入CTRL-C来终止它,然后控件返回到shell。
能否解释一下它是如何工作的,特别是为什么父进程(Shell)没有终止?
shell必须对CTRL+C事件做一些特殊处理吗?如果是的话,它到底是做什么的?
发布于 2018-04-11 09:51:06
默认情况下,信号由内核处理。旧的Unix系统有15个信号,现在有了更多信号。你可以检查一下</usr/include/signal.h>
Ctrl+C是有名称的信号SIGINT
。
处理每个信号的默认操作也在内核中定义,通常它终止接收信号的进程。
所有信号(但SIGKILL
)可以由程序处理。
这就是壳的作用:
find
,贝壳:fork
S本身
你可以trap
你的外壳脚本里也有信号..。
也可以为你的交互式shell设置信号处理,请在顶部输入以下内容~/.profile
。(确保您已经登录并使用另一个终端-你可以把自己锁在外面)
trap 'echo "Dont do this"' 2
现在,每次在shell中按CTRL+C时,它都会打印一条消息。
发布于 2018-04-11 10:38:00
SIGINT
信号由终端线规则产生,并广播到终端的所有进程前景进程组.您的shell已经为您运行的命令(或命令管道)创建了一个新的进程组,并告诉终端该进程组是其(终端的)前台进程组。前景命令管道是将shell作为终端的前台进程组编程到终端的进程组的命令管道,在前台和后台之间切换“作业”是一个外壳告诉终端哪个进程组现在是前台进程组的问题。
shell进程本身也属于另一个进程组,所以当其中一个进程组处于前台时,它不会接收到信号,这很简单。
https://stackoverflow.com/questions/-100008053
复制相似问题