我在这里写一个简单的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是由OS自动发送的,还是我必须自己发送?如果是后者,我怎么能告诉孩子要从终端读取?
谢谢!
答案 0 :(得分:0)
终于明白了。没有对SIGTTIN的响应是因为父母忽略了这个信号。在子级中,所有信号处理程序都必须设置为默认值,包括SIGTTIN信号。