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()
來回收子進程的資源。這樣可以避免僵尸進程的產生。