我正在尝试在 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/