有代码调用一个fork,将当前终端组切换到一个新的组,这个组的leader是fork之后的进程,之后的主进程只是等待child完成。
新进程执行某些操作后,当前终端组切换到之前的终端组,但如果新进程因信号而终止怎么办?它没有到达将组切换到上一个组的代码行,结果发现主进程现在已保留在后台。
我为此使用 tcsetpgrp。
问题更简单:如何在没有活动进程参与的情况下使后台进程成为当前进程(例如,如果活动进程已经结束)。
更新(代码):
int main(int argc, char **argv)
{
int32_t pid;
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
}
if (pid == 0) {
execlp("cat", "cat", NULL);
perror("cat");
fflush(stderr);
_exit(EXIT_FAILURE);
}
setpgid(pid, pid);
tcsetpgrp(0, pid);
wait(NULL);
tcsetpgrp(0, getpgid(getpid())); // не работает?
int32_t c = 0;
while ((c = fgetc(stdin)) != 'g');
return 0;
}
运行代码的一个例子,就是“cat”启动,进入asd,程序也发出asd,我按ctrl+c,“cat”结束就这样,主进程还是后台。

在更清楚地阅读 man tcsetpgrp... 中可以找到问题的答案。
“如果后台进程组的成员在其会话中调用 tcsetpgrp(),并且调用进程未阻塞或忽略 SIGTTOU,则会向该后台进程组的所有成员发送 SIGTTOU 信号。”
为什么在更改当前组时会出现?我寻找信号的完整描述并找到:
SIGTTOU 信号在尝试输出到终端或尝试更改设置时被一组后台进程接收(这就是我如何翻译短语“...写入终端或设置其模式...”) , "...设置它的模式..." - 这还包括尝试更改当前组(我认为是,显然是这样)。来自 gnu.org 的完整描述:
“这类似于 SIGTTIN,但是当后台作业中的进程尝试写入终端或设置其模式时生成。同样,默认操作是停止进程。SIGTTOU 仅在尝试写入时生成端子,如果设置了 TOSTOP 输出模式;请参阅输出模式。”。
这是不允许主进程停止的代码:
或者在程序的开头调用 signal(),并在新的进程中调用 signal(SIGTTOU, SIG_DFL)。像这样的东西。感谢您的帮助,一切照常,初级))
如何等待那个过程下降 - 让他切换组