后台进程写入STDOUT时没有SIGTTOU

时间:2018-01-31 02:30:51

标签: c unix linux-kernel operating-system

在下面的代码中,在为子进程调用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");
}

1 个答案:

答案 0 :(得分:0)

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

要启用它,您可以运行SIGTTOUstty tostop禁用),这会打开终端的stty -tostop标志。

参见以下示例:

TOSTOP