子进程自杀但变成僵尸

子进程自杀但变成僵尸

我需要在 Raspberry Pi 上打开 GPIO 一段时间,因此我创建了一个创建子进程的函数,将 GPIO 打开一段时间然后关闭。问题是,当我尝试让子进程自行终止时,它会像僵尸一样留下来。这个函数被执行了很多次,所以它不能保持这种状态。有人有解决方案吗?谢谢

void my_function(GPIOClass* gpio,useconds_t time) { pid_t pid=fork(); if(pid==0) { signal(SIGALRM,killchild) gpio->setval_gpio("1"); usleep(time*1000); gpio->setval_gpio("0"); alarm(3); while(1); } }

答案1

您将需要从父进程获取子进程。看wait(2)。似乎发生的情况是,您只是处理执行子进程代码的情况,而只是忽略父进程中的结果。因此,父进程在子进程退出后不会执行任何清理操作,从而导致 PID 泄漏。

最简单的解决方案是将以下else情况添加到if条件中。

else if (pid > 0) {
    int status;
    waitpid(pid, &status, 0);
}

编辑:上述条件将阻塞父进程,直到子进程完成。当子进程退出时,SIGCHLD信号会发送给父进程,默认情况下会被忽略。但是,根据 POSIX.1-2001,如果您显式地将信号处理程序设置为SIGCHLDto SIG_IGN,那么系统将自动清理子进程,但需要注意的是父进程将不知道子进程的退出状态。

在初始化函数中,添加以下代码:

signal(SIGCHLD, SIG_IGN);

相关内容