【问题标题】:Stop signal propagation in child process making exec在子进程中停止信号传播
【发布时间】:2017-12-17 16:54:47
【问题描述】:

我目前正在制作一个 shell,但在启动需要在后台工作的进程以及在启动后按 CTRL-C 时遇到了麻烦。

基本上一切正常,但是如果我在 forked-execvp 进程运行时按 CTRL-C,即使我已经处理了信号,CTRL-C 也会传播给我的孩子。我理解传播的原因(如果我理解正确,信号会发送给与终端相关的所有子节点)

问题就像我在上一个与我的问题相关的主题中看到的那样,当我们执行 exec 之后,我们无法处理信号。

所以我向社区询问是否有办法在我的孩子身上处理这个 ctrl-c(基本上什么都不做),因为我需要在杀死每个后台进程之前在我的父亲进程中进行确认。

希望清楚,如果有任何误解,请随时询问更多信息(抱歉英语不是我的母语)。谢谢

【问题讨论】:

  • pause() in child 的使用情况如何,即阻止子执行直到父母完成或按下CTRl+C,并且只有在收到任何信号时,pause() 暂停才会被撤销。
  • 问题是我不能暂停我的孩子,它需要像任何正常的进程一样工作(基本上,我在我的孩子身上执行了一个 «emacs & » 所以我不能暂停他。问题是我需要一种方法在 CTRL+C 到达我现在是 execvp 的孩子之前捕获它,因为我需要在杀死他之前得到用户的确认
  • 那么你应该使用fcntl(),因为fcntl()的工作之一是manage the signal(阅读fcntl手册页关于名为F_GETOWN,F_GETSIG的标志)。使用SIGIO,这有点像ASYNC_IO,即在孩子没有收到任何信号之前,不管它之前在做什么,当它收到任何信号时安装处理程序。
  • 好吧,我想我明白了,但你确定即使我在孩子身上做了一个 execvp,我也能做到吗?我的意思是所有信号、函数、变量等等,现在都被新程序替换了,所以 fcntl 仍然是我的解决方案?

标签: c linux operating-system multiprocessing


【解决方案1】:

键盘中断产生的信号(如Ctrl+C)被发送到当前会话前台组中的每个进程。 防止后台进程受到这些信号影响的最佳方法是将其与终端会话(以及前台组)分离。 为此,您需要在执行之前调用setsid(2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多