C 后台进程写入标准输出时无信号

C 后台进程写入标准输出时无信号,c,unix,linux-kernel,operating-system,C,Unix,Linux Kernel,Operating System,在下面的代码中,在我为子进程调用setpgid之后,子进程应该在它自己的进程组中,而父进程仍然在前台组中。我用strace跟踪信号。ls进程在没有出现SIGTOU的情况下成功写入STDOUT。当后台进程写入终端时,它不会得到SIGTTOU吗 shell通常支持作业控制,并允许进程像某些命令一样在后台运行&因此,默认情况下允许后台进程在不接收sigttoo的情况下输出到终端更有意义 要启用它,您可以运行stty-tostop stty-tostop for disabled,它打开终端的tosto

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

shell通常支持作业控制,并允许进程像某些命令一样在后台运行&因此,默认情况下允许后台进程在不接收sigttoo的情况下输出到终端更有意义

要启用它,您可以运行stty-tostop stty-tostop for disabled,它打开终端的tostop标志

请参见以下示例:

[步骤101]stty-a | grep tostop isig icanon iexten echo echok-echonl-noflsh-xcase-tostop-echoprt ^^^^^^^ [步骤102]sh-c“回声你好世界”& [1] 39554 [步骤103]你好,世界 [1] +完成sh-c“回声你好世界” [步骤104] [步骤105]stty tostop [步骤106]stty-a | grep tostop isig icanon iexten echo echok-echonl-noflsh-xcase tostop-echoprt ^^^^^^ [步骤107] [步骤108]sh-c“回声你好世界”& [1] 39558 [步骤109] [1] +停止sh-c“回声你好世界” [步骤110]
我相信这是一个选择,但我不知道如何改变它。前段时间,默认设置已更改,从发送SIGTTOU改为不发送,只显示输出。尝试运行stty tostop以在该终端中获取SIGTTOU。奇怪的是,为什么要使用宏而不是函数,可能是内联的?@chux我真的不知道。通过define语句声明函数是一种糟糕的编程实践。最好只给它一个修饰符:inline
#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");
}