c - 用 fork 避免成为僵尸结束父进程

标签 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();
}

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

最佳答案

你可以双 fork :

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

 waitpid(pid, ...);

 read(...);

也许,setsid() 应该在 child 中调用和/或 SIGHUP 被忽略。

上面的代码将第二个 child (您的 execl())从主程序中分离出来,init 将获取它。

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

关于c - 用 fork 避免成为僵尸结束父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20350733/

相关文章:

c - 在 C 中添加无符号整数

c - Arduino 传感器 10DOF MPU9255 无法获取磁力计数据

c - 如何编译这个 Linux 程序?

c++ - 运行时堆栈是否保存在内存的数据段中?

c++ - 我可以将 mmap 的结果存储为整数吗?

c - 两个进程写入同一个文件

python - 在守护线程中创建的进程的主线程是守护进程本身是Python错误吗?

winapi - 为什么 Unix 有 fork() 而没有 CreateProcess()?