【发布时间】:2018-12-03 10:23:42
【问题描述】:
我正在编写自己的 shell,并且我支持作业控制[1](类似于 jobs)。我可以停止进程,在前台和后台恢复它们[2]。这一切都在很大程度上按预期工作 - 至少从用户的角度来看。
但是我遇到的问题是,在后台恢复工作时,任何从 STDIN 读取的应用程序都会与 readline 竞争(我实际上已经编写了自己的 readline API,原因超出了这个问题的范围),这会破坏可用性贝壳。
我承认这些情况很少见,但我的理解是,通常应该发生的情况是任何需要从 STDIN[3] 读取的后台进程都发送 SIGTTIN[4] 信号。
我的问题是如何监控从 STDIN 读取的应用程序 - 以便在需要时发送 SIGTTIN?
这就是我的研究走到了尽头的地方。所以我对其他 shell 如何处理这类问题很感兴趣。
如果上面的描述不是很清楚,以下是一些参考资料,可帮助解释我正在尝试做的事情:
[1]https://en.wikipedia.org/wiki/Job_control_(Unix)#Overview
[2]https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bg.html
[3]https://en.wikipedia.org/wiki/Job_control_(Unix)#Implementation
【问题讨论】:
-
这不是 shell 的一部分,但是系统例如在后台启动的 tr 命令
tr 01 10 &将被停止,因为尝试从标准输入读取并在后台运行 -
然而停止并不意味着在
fg %1或它继续的作业 ID 之后终止 -
是的,“停止”的术语有点误导,但我已经确定了那部分。然而,听起来我需要重新编写我所有的作业控制逻辑,因为我目前正试图在 shell 中处理它,而不是让内核去做这件事并设置进程组。
标签: bash shell signals zsh jobs