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

时间:2014-12-19 09:19:08

标签: c unix

我使用tcsetpgrp()函数,我在gcc编译器中运行此代码。我想将STDOUT_FILENO更改为由子进程创建的新组。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main (void)
{
  printf("Parent pgid=%d\n", getpgrp());
  printf("STDOUT(parent)=%d\n", tcgetpgrp(STDOUT_FILENO));
  pid_t pid;
  if(0 == (pid = fork()))
    {
      setpgid(0, 0);     
      printf("child pgid=%d\n", getpgrp());
      if(0 != tcsetpgrp(STDOUT_FILENO, 0))
        perror("Error");
      printf("After changing %d\n", tcgetpgrp(STDOUT_FILENO));
      exit(0);
    }
  wait(0);
  return 0;
}

在该子进程中,当tcsetpgrp()函数到达子进程终止且退出状态未向父进程报告时。

1 个答案:

答案 0 :(得分:2)

当子进程调用tcsetpgrp时,它会收到SIGTTOU信号,导致它停止。当子进程停止时,父进程会阻塞对wait的调用,等待子进程终止。

简单的解决方案是在调用SIGTTOU之后忽略孩子中的fork信号:

signal(SIGTTOU, SIG_IGN)

您的代码还有另一个问题 - 您正在尝试将终端的进程组更改为0,这没有任何意义。你可能想说:

tcsetpgrp(STDOUT_FILENO, getpgrp())