我正在尝试在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();
}
解决这个问题的最佳方法是什么?
答案 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()
失败)。