僵死进程(Zombie Process)是指已经终止,但其父进程尚未回收其资源的进程。在Linux系统中,每个进程都有一个唯一的进程ID(PID),当一个进程结束时,它的资源(如内存、文件描述符等)会被释放,但它的进程控制块(PCB)仍然保留在内核中,直到父进程调用wait()或waitpid()系统调用来回收它。如果父进程没有这样做,这个进程就会变成僵死进程。
wait()或waitpid():父进程没有正确地回收子进程的资源。在父进程中调用wait()或waitpid()函数来回收子进程的资源。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
exit(0);
} else if (pid > 0) {
// 父进程
wait(NULL); // 回收子进程
} else {
perror("fork");
exit(1);
}
return 0;
}在父进程中设置信号处理函数,当子进程结束时,父进程会收到SIGCHLD信号,并在信号处理函数中调用wait()或waitpid()。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
void sigchld_handler(int signum) {
while (wait(NULL) > 0);
}
int main() {
signal(SIGCHLD, sigch2_handler); // 设置SIGCHLD信号处理函数
pid_t pid = fork();
if (pid == 0) {
// 子进程
exit(0);
} else if (pid > 0) {
// 父进程
// 父进程继续执行其他任务
} else {
perror("fork");
exit(1);
}
return 0;
}可以使用shell脚本定期清理僵死进程。
#!/bin/bash
# 清理僵死进程
for pid in $(ps aux | awk '{ if ($8 == "Z") print $2 }'); do
kill -9 $pid
done通过以上方法,可以有效地管理和清理Linux系统中的僵死进程,确保系统的稳定性和资源的有效利用。