我在这里写了一个简单的 Shell。简而言之,我正在做这些事情(伪代码):
call fork()
if return value is zero: //child
setpgid(0,0)
if (foreground)
tcsetpgrp() //give this child access to terminal
reset all signal handlers messed up by parent
unblock all signals that are blocked by parent
execve()
else: //parent
if (foreground)
tcsetpgrp() //give child access to terminal
add this job to job list
unblock all signals
wait for this job to finish
tcsetpgrp() //get terminal access back
if (background)
add this job to job list
unblock all signals
我要测试的是/bin/cat。现在,如果我在前台运行此 Shell,它可以很好地用于/bin/cat。但是,如果我键入/bin/cat & 让它在后台运行,我会收到输入/输出错误。据我了解,当后台作业试图从终端读取时,应该将 SIGTTIN 发送给它。所以理想情况下,当我输入/bin/cat & 时,它会被 SIGTTIN 停止。如果我使用“bg”命令恢复它,它将再次被 SIGTTIN 停止。
我很困惑的是我怎么能实现这个。 SIGTTIN 是由操作系统自动发送的,还是我必须自己发送?如果是后者,我如何判断 child 是否要从终端阅读?
谢谢!
最佳答案
终于明白了。没有响应 SIGTTIN 是因为父级忽略了这个信号。在 child 中,所有信号处理程序都必须设置为默认值,包括 SIGTTIN 信号。
关于c - 从终端读取的后台作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096338/