gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:48 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com