我使用 tcsetpgrp(( 函数,我在 gcc 编译器中运行此代码。我想将STDOUT_FILENO更改为由子进程创建的新组。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main (void)
{
printf("Parent pgid=%dn", getpgrp());
printf("STDOUT(parent)=%dn", tcgetpgrp(STDOUT_FILENO));
pid_t pid;
if(0 == (pid = fork()))
{
setpgid(0, 0);
printf("child pgid=%dn", getpgrp());
if(0 != tcsetpgrp(STDOUT_FILENO, 0))
perror("Error");
printf("After changing %dn", tcgetpgrp(STDOUT_FILENO));
exit(0);
}
wait(0);
return 0;
}
在该子进程中,当 tcsetpgrp(( 函数到达子进程时终止,并且退出状态不报告给父进程。
当子进程调用tcsetpgrp
时,它接收到SIGTTOU
信号,这导致它停止。 当子进程停止时,父进程会阻止对wait
的调用,等待子进程终止。
简单的解决方案是忽略孩子的SIGTTOU
信号,就在呼叫fork
之后:
signal(SIGTTOU, SIG_IGN)
您的代码还有另一个问题 — 您尝试将终端的进程组更改为 0,这没有任何意义。 你可能想说:
tcsetpgrp(STDOUT_FILENO, getpgrp())