Linux僵尸进程(Zombie Process)是一种已经结束运行但尚未被其父进程回收资源的进程。僵尸进程对系统的内存和其他资源有一定的影响,主要包括以下几点:
占用进程表项:
wait()
或waitpid()
来回收其资源。间接内存占用:
文件描述符泄漏:
网络连接泄漏:
系统稳定性:
父进程回收:
wait()
或waitpid()
来回收子进程的资源。waitpid()
来指定等待特定的子进程,或者使用wait()
来等待任意一个子进程结束。信号处理:
wait()
或waitpid()
。系统监控:
ps
、top
、htop
等来监控系统中的僵尸进程,并及时处理。以下是一个简单的示例,展示如何在父进程中处理子进程结束的信号:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sigchld_handler(int signum) {
pid_t pid;
int status;
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
printf("Child process %d terminated with status %d\n", pid, status);
}
}
int main() {
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// Child process
printf("Child process is running\n");
sleep(5);
printf("Child process is exiting\n");
exit(EXIT_SUCCESS);
} else {
// Parent process
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);
}
printf("Parent process is waiting for child process to finish\n");
while (1) {
sleep(1);
}
}
return 0;
}
在这个示例中,父进程设置了一个信号处理函数sigchld_handler
来处理子进程结束的信号,并在信号处理函数中调用waitpid()
来回收子进程的资源。这样可以避免僵尸进程的产生。