【发布时间】: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