【发布时间】: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