【问题标题】:Why background processes in shell can print to terminal?为什么shell中的后台进程可以打印到终端?
【发布时间】:2019-11-03 00:07:44
【问题描述】:

我知道这个问题之前在 herehere 中被问过。但我觉得答案并没有完全解决我的困惑。

假设我正在实现自己的 shell。默认情况下,我会将每个进程置于后台。代码sn-p如下:

pid_t rc = fork();
if (rc > 0) {
  int status = 
  setpgid(rc, rc);
  tcsetpgrp(STDIN_FILENO, getpgrp());
} else if (rc == 0) {
  reset_signal_handlers(); // this reset all signal handlers to default
  setpgrp();
  execv(args[0], args);
}

根据我的理解,SIGTTOU 子进程中的默认信号处理程序是暂停它。所以当子进程试图打印到终端时,它应该因为信号而停止。为什么还能打印?

wikipedia 中写道:

Shell 通常会覆盖 SIGTTOU 的默认停止操作,以便后台进程默认将其输出传递到控制终端。

但我正在实现自己的 shell,并且我没有覆盖子进程中的任何处理程序。为什么SIGTTOU 信号仍然被忽略?

【问题讨论】:

    标签: shell signals


    【解决方案1】:

    可以配置后台进程的默认行为。默认行为(来自大多数登录 shell)是在后台进程尝试从终端读取时停止,并允许后台进程发送输出。

    signal on output行为可以被请求

    • stty tostop(从后台获取 SIGTTOU)
    • stty -tostop(后台进程没有 SIGTTOU)

    也可以通过 ioctl 进行修改,参见 'man ioctl_tty'

    【讨论】:

    • 谢谢!只是为了确保,这意味着 terminal 的默认操作是 notSIGTTOU 发送到后台进程对吗?
    猜你喜欢
    • 2014-06-18
    • 2011-07-28
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多