预防僵尸进程的产生可以通过以下几种方法:
使用wait()或waitpid()函数:
设置SIGCHLD信号处理函数:
SIGCHLD信号给父进程。wait()或waitpid()来回收子进程资源。#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sigchld_handler(int s) {
while (waitpid(-1, NULL, WNOHANG) > 0);
}
int main() {
struct sigaction sa;
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("Child process exiting.\n");
exit(0);
} else if (pid > 0) {
// 父进程
printf("Parent process waiting for child.\n");
sleep(1); // 模拟父进程做其他事情
} else {
perror("fork");
exit(EXIT_FAILURE);
}
return 0;
}
fork()和exec()组合exec()系列函数之前,确保父进程已经准备好处理子进程的退出状态。不要忽略SIGCHLD信号:
不要在信号处理函数中调用可能会阻塞的函数:
setsid()创建新的会话setsid()函数。top、htop、ps等)定期检查系统中是否存在僵尸进程。fork()调用,特别是在循环或频繁调用的地方。systemd、supervisord等)来自动管理和监控子进程。通过以上方法,可以有效地预防僵尸进程的产生,保持系统的稳定性和性能。