我一直在研究这个链接来完成我的shell任务:http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs并且它特别有帮助。我的困惑是,为了再次给出stdin文件描述符的shell控件,我需要在子节点终止后从shell调用tcsetpgrp
。
How do I get tcsetpgrp() to work in C?
我已经搜索了不同的Stack Overflow问题,但没有一个能正确地告诉我为什么GNU会推广这种方法。由于shell当前位于"后台",tcsetpgrp()
会将SIGTTOU发送到我的进程组。当前的解决方案是在调用方法之前忽略它,然后可能将其重置为默认值。我该怎么办?
编辑:我想要注意的是,在shell通过tcsetpgrp()
将stdin控制权传递给另一个进程组之前,首先将其设置在另一个进程组中。一旦孩子死了,shell就会调用tcsetpgrp()
来回收stdin。 GNU建议将此作为一种可能的实现,但是为了简单起见,它使用了稍微不同的实现here。
如果后台进程组的成员在其会话中调用
tcsetpgrp()
,并且调用进程未阻止或忽略SIGTTOU,则会向该后台进程组的所有成员发送SIGTTOU信号。
答案 0 :(得分:2)
我也即将结束执行Shell程序,并且可以在这个问题上a一口气:
TL; DR:即使此时外壳将是后台进程,但一旦退出最新的前台进程组,它仍需要为其自身回收终端前台;否则,终端将挂起,并且不会有任何进程消耗用户的输入。
这是shell从命令行启动作业时会话的外观:
GNU C库手册还有另一节(28.5.4 Foreground and Background),简要解释了为什么外壳程序必须回收终端forg