从终端读取的后台工作

时间:2012-10-27 01:12:13

标签: c shell unix background jobs

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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