2

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

谢谢!

4

1 回答 1

0

终于明白了。对 SIGTTIN 没有响应是因为父母忽略了这个信号。在孩子中,所有信号处理程序都必须设置为默认值,包括 SIGTTIN 信号。

于 2012-10-27T21:09:51.157 回答