防范Linux僵尸进程可以通过以下几种方法:
wait()
或waitpid()
来等待子进程结束并回收资源。wait()
或waitpid()
:pid_t pid = fork(); if (pid == 0) { // 子进程代码 exit(0); } else if (pid > 0) { // 父进程代码 int status; waitpid(pid, &status, 0); // 等待子进程结束并回收资源 } else { // 错误处理 }
#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.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) { // 子进程代码 exit(0); } // 父进程继续执行其他任务 while (1) { // 主循环 } return 0; }
nohup
和&
nohup your_command &
这样即使终端关闭,命令也会在后台运行,并且不会因为终端关闭而变成僵尸进程。使用ps
和top
命令监控进程:
ps aux | grep Z
这可以帮助你发现哪些进程是僵尸进程。
使用kill
命令杀死僵尸进程的父进程: 如果僵尸进程的父进程已经结束,可以使用kill -9
命令杀死僵尸进程。
systemd
服务systemd
服务运行: systemd
会自动处理子进程的回收,避免僵尸进程的产生。exit()
函数,并且父进程能够正确处理子进程的退出状态。通过以上方法,可以有效地防范Linux僵尸进程的产生和积累。