C语言 为什么子进程终止?请解释一下



我使用 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())

相关内容

最新更新