【问题标题】:No SIGTTOU when Background Process Writing to STDOUT后台进程写入 STDOUT 时没有 SIGTTOU
【发布时间】:2018-07-10 01:19:19
【问题描述】:

在下面的代码中,我为子进程调用setpgid后,子进程应该在自己的进程组中(成为后台组),而父进程仍然在前台组中。我使用strace 来跟踪信号。 ls 进程成功写入 STDOUT,而没有出现 SIGTTOU。当后台进程写入终端时,不会得到SIGTTOU吗?

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define CHECK(syscall, msg) do {                    \
    if ((syscall) == -1) {                          \
      perror(msg);                                  \
      _exit(1);                                     \
    }                                               \
  } while(0)

int main () {
  int ls_pid;
  char *ls_argv[] = { "ls", NULL };

  CHECK(ls_pid = fork(), "fork error");
  if (!ls_pid) {
    CHECK(setpgid(0, 0), "child setpgid error");
    CHECK(execvp(ls_argv[0], ls_argv), "execvp error");
  } else {
    sleep(2);
  }
  CHECK(wait(NULL), "wait error");

  printf("Finish\n");
}

【问题讨论】:

  • 我相信这是一个选项,但我不知道如何更改它。前段时间,默认值已更改,从发送 SIGTTOU 变为不发送,只显示输出。
  • 尝试运行 stty tostop 以在该终端中获取 SIGTTOU。
  • 很好奇,为什么使用宏而不是函数,可能是inline
  • @chux 我真的不知道。看起来很酷。
  • 通过#define 语句声明函数是一种糟糕的编程习惯。最好只给它修饰符:inline

标签: c unix linux-kernel operating-system


【解决方案1】:

Shell 通常支持作业控制并允许进程在后台运行(如some-command &amp;),因此默认情况下允许后台进程输出到终端而不接收SIGTTOU 更有意义。

要启用它,您可以运行stty tostopstty -tostop 用于禁用)打开终端的TOSTOP 标志。

参见以下示例:

[STEP 101] # stty -a | grep tostop
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
                                                           ^^^^^^^
[STEP 102] # sh -c 'echo hello world' &
[1] 39554
[STEP 103] # hello world

[1]+  Done                    sh -c 'echo hello world'
[STEP 104] #
[STEP 105] # stty tostop
[STEP 106] # stty -a | grep tostop
isig icanon iexten echo echoe echok -echonl -noflsh -xcase tostop -echoprt
                                                           ^^^^^^
[STEP 107] #
[STEP 108] # sh -c 'echo hello world' &
[1] 39558
[STEP 109] #

[1]+  Stopped                 sh -c 'echo hello world'
[STEP 110] #

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多