linux进程系列(7)僵尸进程 ゝ一纸荒年。 2022-07-14 05:23 156阅读 0赞 僵尸进程 1、子进程结束但是没有完全释放内存(在内核中的task\_struct没有释放),该进程就成为僵尸进程。 2、当僵尸进程的父进程结束后就会被init进程领养,最终被回收。 3、避免僵尸进程 1)让僵尸进程的父进程来回收,父进程每隔一段时间来查询子进程是否结束并回收,调用wait()或者waitpid() ,通知内核释放僵尸进程。 2)采用信号SIGCHLD通知处理,并在信号处理程序中调用wait函数。 3)让僵尸进程成为孤儿进程,由init进程回收。 /* * process_zombie.c * * Created on: 2016-11-28 * Author: river */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid; pid = fork(); if(pid < 0) { perror("fork error"); exit(1); } else if(pid == 0)//子进程 { printf("pid: %d, ppid: %d\n", getpid(), getppid()); exit(0);//子进程结束,父进程还在运行,称为僵尸进程 } while(1)//父进程继续做循环 { sleep(1); } exit(0); } 上面的程序运行之后,用ps查看当前进程,会看到如下结果: ![Center][] 进程2385是正在运行的父进程,子进程2386有<defunct>标志,表示2386是僵尸进程。当我们ctrl+c结束父进程运行后,再ps查看当前运行进程,父进程与僵尸进程都不存在了,因为当僵尸进程的父进程被终止后,僵尸进程就成为了孤儿进程,孤儿进程由init进程领养,最终被回收。当然,在父进程没有结束的情况下,也可以使用kill命令直接杀死僵尸进程。 [Center]: /images/20220714/d6addc9bfec54ee68b89128d2f56365b.png
还没有评论,来说两句吧...