在下面的代码中,在为子进程调用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");
}
答案 0 :(得分:0)
Shell通常支持作业控制并允许进程在后台运行(如some-command &
),因此默认情况下允许后台进程输出到终端而不接收{{}更有意义1}}。
要启用它,您可以运行SIGTTOU
(stty tostop
禁用),这会打开终端的stty -tostop
标志。
参见以下示例:
TOSTOP