首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ctrl-C如何终止子进程?

Ctrl-C如何终止子进程?
EN

Stack Overflow用户
提问于 2018-04-11 00:51:29
回答 2查看 0关注 0票数 0

我试图了解CTRL+C如何终止子进程,而不是父进程。我在一些脚本shell中看到了这种行为,如bash在那里,可以启动一些长期运行的进程,然后通过输入CTRL-C来终止它,然后控件返回到shell。

能否解释一下它是如何工作的,特别是为什么父进程(Shell)没有终止?

shell必须对CTRL+C事件做一些特殊处理吗?如果是的话,它到底是做什么的?

EN

回答 2

Stack Overflow用户

发布于 2018-04-11 09:51:06

默认情况下,信号由内核处理。旧的Unix系统有15个信号,现在有了更多信号。你可以检查一下</usr/include/signal.h>Ctrl+C是有名称的信号SIGINT

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

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

这就是壳的作用:

  • 当shell在交互模式下运行时,它会对此模式进行特殊的信号处理。
  • 例如,当运行程序时find,贝壳:
    • forkS本身
    • 对于子节点设置默认的信号处理。
    • 用给定的命令替换子命令(例如,用find)
    • 当按下CTRL+C时,父shell处理此信号,但子程序将接收它--使用默认操作--终止。

你可以trap你的外壳脚本里也有信号..。

也可以为你的交互式shell设置信号处理,请在顶部输入以下内容~/.profile。(确保您已经登录并使用另一个终端-你可以把自己锁在外面)

trap 'echo "Dont do this"' 2

现在,每次在shell中按CTRL+C时,它都会打印一条消息。

票数 0
EN

Stack Overflow用户

发布于 2018-04-11 10:38:00

SIGINT信号由终端线规则产生,并广播到终端的所有进程前景进程组.您的shell已经为您运行的命令(或命令管道)创建了一个新的进程组,并告诉终端该进程组是其(终端的)前台进程组。前景命令管道是将shell作为终端的前台进程组编程到终端的进程组的命令管道,在前台和后台之间切换“作业”是一个外壳告诉终端哪个进程组现在是前台进程组的问题。

shell进程本身也属于另一个进程组,所以当其中一个进程组处于前台时,它不会接收到信号,这很简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档