僵尸进程(Zombie Process)是指一个子进程已经结束运行,但由于父进程没有调用 wait()
或 waitpid()
系统调用来回收子进程的资源,导致子进程的进程描述符仍然保存在系统中,从而形成的“僵尸”状态。
SIGCHLD
信号,通知父进程其退出状态。如果父进程没有调用 wait()
或 waitpid()
来读取子进程的退出状态并回收资源,子进程就会成为僵尸进程。init
进程(进程号为 1)接管,init
进程可以清理这些孤儿进程产生的僵尸进程。可以使用以下命令来查看系统中的僵尸进程:
ps -ef | grep defunct
:查找状态为 Z
的进程。ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]'
:通过 grep
抓取状态为 Z
或 z
的进程。init
进程会负责清理其子进程产生的僵尸进程。ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]' | awk '{print 2}' | xargs kill -9
wait()
或 waitpid()
系统调用:父进程可以在适当的时候调用 wait()
或 waitpid()
,等待子进程的终止,并获取子进程的终止状态,从而清除僵尸进程。SIGCHLD
信号捕捉:父进程可以使用 signal()
函数注册 SIGCHLD
信号的处理函数,在子进程终止时通过信号处理函数调用 wait()
或 waitpid()
处理子进程的终止状态。SIGCHLD
信号:父进程可以使用 signal()
函数将 SIGCHLD
信号的处理函数设置为 SIG_IGN
,表示忽略该信号。这样,在子进程终止后,内核会自动回收子进程的资源,不会产生僵尸进程。亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
推荐阅读:CentOS僵尸进程产生原因是什么