用叉子结束父进程避免变成僵尸

时间:2013-12-03 12:05:53

标签: c linux fork ipc

我正在尝试在C项目中实现一些代码,以避免使用阻塞我项目的pclose。现在我使用的是fork() + exec(),但我遇到了问题。我已经创建了一个管道来互连这两个进程。在子进程中,我正在调用exec()来执行读取输入的脚本,并且我正在父进程中捕获脚本的输出。

问题是脚本随机被阻止,我不希望这会阻止我的程序。当父进程结束读取输出时,它已经完成而没有wait()以避免无限期等待,但正因为如此,子进程变成了僵尸进程。

这是我的代码:

int    pipefd[2];
        int nbytes = 0;

        signal(SIGCHLD, kill_child);

        pipe(pipefd);
        if (vfork() == 0)
        {
                close(pipefd[0]);
                dup2(pipefd[1], 1);
                close(pipefd[1]);
                execl("/bin/sh", "sh", "-c", cpCommand, NULL);
                exit(EXIT_SUCCESS);
        }
        else
        {
                close(pipefd[1]);
                while ((nbytes = read(pipefd[0], output, sizeof(output))) > 0)
                {
                        write(1, output, nbytes);
                }
                close(pipefd[1]);
        }
        strcpy(cpOutput, output);


void kill_child(int sig_num)
{
        wait();
}

解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

你可以双叉:

 pid_t pid = fork();
 if (pid == 0) {
      pid = fork();
      if (pid == 0) {
           ...
           execl(...);
      }
      _exit(0);
 }

 waitpid(pid, ...);

 read(...);

也许,应该在孩子中调用setsid()和/或忽略SIGHUP

上面的代码将第二个孩子(你的execl())从主程序中分离出来,而init将收获它。

您可能希望使用某些控制管道向主进程发出错误信号(execl()失败)。