【问题标题】:background jobs read from terminal从终端读取的后台作业
【发布时间】:2012-10-17 06:35:32
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c shell unix background jobs


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2011-05-09
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      相关资源
      最近更新 更多