c - 从终端读取的后台作业

标签 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 是由操作系统自动发送的,还是我必须自己发送?如果是后者,我如何判断 child 是否要从终端阅读?

谢谢!

最佳答案

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

关于c - 从终端读取的后台作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096338/

相关文章:

转换旧代码。间接需要指针操作数

python - 你如何使用 Elixir 解析 150g csv 文件? shell ? SQL数据库?

linux - 对于高级用户来说,有哪些优秀的 Linux/Unix 书籍?

c - 通过客户端服务器方法写入和读取共享内存以获取数字的平方

c - 如何开始编写一种非常简单的编程语言

arrays - 如何使用 jq 将 JSON 文件分解为包裹在数组中的较小 json?

c++ - 在 UNIX 系统上调用 sleep(0) 有什么影响?

linux - 为几个用户验证 "su"的 Bash 脚本

c - 如何在C编程中的另一个函数中调用一个函数

linux - 需要 : hostname while trying to install Fish Shell