我在这里写一个简单的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 是操作系统自动发送的,还是我必须自己发送?如果是后者,我怎么能告诉孩子是否要从终端阅读?
谢谢!