![子进程自杀但变成僵尸](https://linux22.com/image/161035/%E5%AD%90%E8%BF%9B%E7%A8%8B%E8%87%AA%E6%9D%80%E4%BD%86%E5%8F%98%E6%88%90%E5%83%B5%E5%B0%B8.png)
我需要在 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,如果您显式地将信号处理程序设置为SIGCHLD
to SIG_IGN
,那么系统将自动清理子进程,但需要注意的是父进程将不知道子进程的退出状态。
在初始化函数中,添加以下代码:
signal(SIGCHLD, SIG_IGN);