在Linux系统中,僵尸进程是指已经结束运行但尚未被其父进程回收资源的进程
kill命令终止父进程。这将导致僵尸进程被init进程(PID为1)接管,init进程会自动清理这些僵尸进程。ps -ef | grep 'Z' # 查找僵尸进程及其父进程ID
kill -TERM 父进程ID # 终止父进程
waitpid()函数:在编写程序时,可以使用waitpid()函数来等待子进程结束并回收其资源。这样可以避免子进程变成僵尸进程。#include <sys/types.h>
#include <sys/wait.h>
pid_t pid = fork();
if (pid == 0) {
// 子进程执行任务
} else if (pid > 0) {
int status;
waitpid(pid, &status, 0); // 等待子进程结束并回收资源
} else {
// 错误处理
}
signal()函数:在编写程序时,可以使用signal()函数来设置子进程退出时的信号处理函数。当子进程退出时,信号处理函数会被调用,从而可以回收子进程的资源。#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void sigchld_handler(int signum) {
pid_t pid;
int status;
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
// 收回子进程资源
}
}
int main() {
struct sigaction sa;
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGCHLD, &sa, NULL);
// 创建子进程并执行任务
}
nohup命令:当运行一个程序时,可以使用nohup命令来忽略挂起信号(SIGHUP)。这样即使关闭终端,程序也会继续运行,并且在程序退出时自动回收子进程资源。nohup your_command &
总之,要减少Linux僵尸进程,可以在编写程序时使用waitpid()和signal()函数来回收子进程资源,或者在运行程序时使用nohup命令来忽略挂起信号。