gpt4 book ai didi

c - 后台进程写入 STDOUT 时没有 SIGTTOU

转载 作者:行者123 更新时间:2023-11-30 14:51:06 25 4
gpt4 key购买 nike

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

最佳答案

Shell 通常支持作业控制并允许进程在后台运行(如some-command &),因此默认情况下允许后台进程输出到终端未收到 SIGTTOU

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

请参阅以下示例:

[STEP 101] # stty -a | grep tostop
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
^^^^^^^
[STEP 102] # sh -c 'echo hello world' &
[1] 39554
[STEP 103] # hello world

[1]+ Done sh -c 'echo hello world'
[STEP 104] #
[STEP 105] # stty tostop
[STEP 106] # stty -a | grep tostop
isig icanon iexten echo echoe echok -echonl -noflsh -xcase tostop -echoprt
^^^^^^
[STEP 107] #
[STEP 108] # sh -c 'echo hello world' &
[1] 39558
[STEP 109] #

[1]+ Stopped sh -c 'echo hello world'
[STEP 110] #

关于c - 后台进程写入 STDOUT 时没有 SIGTTOU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com