C 后台进程写入标准输出时无信号
在下面的代码中,在我为子进程调用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]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
我相信这是一个选择,但我不知道如何改变它。前段时间,默认设置已更改,从发送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");
}