Linux僵尸进程(Zombie Process)是一种特殊的进程状态,它已经完成了执行,但其父进程尚未调用wait()或waitpid()函数来收集其退出状态。因此,僵尸进程在系统中仍然保留一个进程表项,直到其父进程处理完它的退出状态或者父进程结束。
僵尸进程的生命周期可以分为以下几个阶段:
SIGCHLD信号给其父进程。wait()或waitpid()),子进程就会变成僵尸进程。ps命令看到。wait()或waitpid()来收集子进程的退出状态时,僵尸进程会被系统自动回收。为了避免僵尸进程的产生,可以采取以下措施:
SIGCHLD信号,并在信号处理函数中调用wait()或waitpid()来收集子进程的退出状态。waitpid()代替wait(),这样可以更灵活地控制等待哪个子进程,并且可以避免僵尸进程的产生。以下是一个简单的示例,展示了如何正确处理子进程的退出状态以避免僵尸进程:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void sigchld_handler(int signum) {
int status;
pid_t pid;
// 等待任意一个子进程结束
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
printf("Child process %d exited with status %d\n", pid, WEXITSTATUS(status));
}
}
int main() {
pid_t pid;
// 设置SIGCHLD信号处理函数
signal(SIGCHLD, sigchld_handler);
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
// 子进程
printf("Child process is running\n");
sleep(2); // 模拟子进程工作
printf("Child process is exiting\n");
exit(EXIT_SUCCESS);
} else {
// 父进程
printf("Parent process is waiting for child process to finish\n");
sleep(5); // 父进程等待一段时间
printf("Parent process is exiting\n");
}
return 0;
}
在这个示例中,父进程设置了一个信号处理函数sigchld_handler来处理SIGCHLD信号,并在信号处理函数中调用waitpid()来收集子进程的退出状态。这样可以确保即使父进程在子进程之前退出,子进程也不会变成僵尸进程。