当前位置: 首页 > 面试题库 >

Ctrl-C如何终止子进程?

封昊天
2023-03-14
问题内容

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

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

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


问题答案:

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

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



 类似资料:
  • 我试图用< code>exec()调用PHP CLI脚本中的一个长期运行的shell命令。但是我无论如何也想不出如何中断PHP脚本并杀死产生的子进程。好像我一调用< code>exec(),我的信号处理程序就被忽略了。下面的代码像我预期的那样工作;如果我向进程发送SIGTERM,它会回显< code>SIGTERM并立即退出。 但是,如果我替换< code > sleep(60);与< code

  • [注意:这与如何从Java程序启动完全独立的进程有关?但不同] 我希望能够从一个“管理器”Java进程中派生出外部进程(shell脚本),当JVM被杀死时,该进程应该继续运行——但当我杀死父Java程序时,子Java程序似乎也被杀死(注意,如果JVM自然退出,行为会有所不同)。我拥有的最简单的测试程序是: 和外部脚本: 作为 java-带有依赖项的类路径jar。罐子温度。执行官。快跑快跑。嘘 如果

  • 问题内容: 我正在使用以下脚本测试Python线程: 它在Kubuntu 11.10上的Python 2.7中运行。+ 不会杀死它。我还尝试为系统信号添加处理程序,但这没有帮助: 为了杀死该进程,我将程序发送到+ 后,通过PID将其杀死,这不会被忽略。为什么+ 被如此持久地忽略?我该如何解决? 问题答案: + 终止主线程,但是因为您的线程不在守护程序模式下,所以它们继续运行,并且使进程保持活动状态

  • 问题内容: 强制保持Node.js进程运行的最佳方法是什么,即使其事件循环不为空,从而防止进程终止?我能想到的最好的解决方案是: 如果您将间隔时间保持足够长,它将使间隔运行,而不会引起过多干扰。 有更好的方法吗? 问题的长版 我有一个使用Edge.js来注册回调函数的Node.js脚本,以便可以从.NET中的DLL内部对其进行调用。每秒将调用此功能1次,发送一个应打印到控制台的简单序列号。 Edg

  • 我有一个应用Gradle插件的项目。我的问题是,即使底层进程终止,它也不会终止:如果我运行这个: 带有仅包含系统的主系统。退出(0) 程序终止,但Gradle没有终止。当底层Java程序终止时,如何强制Gradle进程终止? 编辑:我知道我可以调用gradle——stop,但这需要另一个进程,这不是一个选项。

  • 问题内容: 我正在使用以下命令启动子流程: 但是,当我尝试杀死使用: 要么 该命令一直在后台运行,所以我想知道如何才能真正终止该过程。 请注意,当我使用以下命令运行命令时: 发出时,它确实成功终止。 问题答案: 使用进程组,以便能够向组中的所有进程发送信号。为此,您应该将会话ID附加到生成的子进程的父进程中,在您的情况下这是一个外壳程序。这将使其成为流程的组长。因此,现在,当信号发送到流程组负责人

  • 问题内容: 我有一个使用线程并发出大量HTTP请求的python脚本。我认为正在发生的事情是,正在读取HTTP请求(使用urllib2)时,它正在阻塞并且没有响应以停止程序。有没有办法解决? 问题答案: 在Windows上,唯一确定的方法是使用。立即停止每个python脚本! (请注意,在某些键盘上,“中断”被标记为“暂停”。)

  • 问题内容: 子进程开始于 有没有办法确保在父异常终止时将其杀死?我需要在Windows和Linux上都能使用。 编辑: 如果存在使用其他启动进程的方法的解决方案,则可以放宽启动子进程的要求。 问题答案: 呵呵,我昨天自己在研究这个!假设您无法更改子程序: 在Linux上,可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTERM;链接到的代码