僵尸进程
2015-08-05 17:04
239 查看
概念
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……
僵尸进程在系统内部的存在方式
进程调用exit,内核释放资源(打开的文件、占用的内存等)但是会保留一定的信息(进程号、退出状态、运行时间等)。父进程通过wait/waitpid获得子进程的这些状态,然后释放子进程保留的资源。
所以说极端的情况下,出现了大量的僵尸进程,那么进程号会被大量的占用,当系统所有进程号都被僵尸进程占用时,就无法创建新的进程了。
产生僵尸进程
View Code
执行以及查看结果:
孙子进程13480由init进程领养了
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……
僵尸进程在系统内部的存在方式
进程调用exit,内核释放资源(打开的文件、占用的内存等)但是会保留一定的信息(进程号、退出状态、运行时间等)。父进程通过wait/waitpid获得子进程的这些状态,然后释放子进程保留的资源。
所以说极端的情况下,出现了大量的僵尸进程,那么进程号会被大量的占用,当系统所有进程号都被僵尸进程占用时,就无法创建新的进程了。
产生僵尸进程
#include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(void) { pid_t child,grdson; if((child=fork()) == 0) { printf("child process id %d\n",getpid()); if((grdson=fork())==0) { printf("grdson process id %d\n", getpid()); sleep(10); exit(0); } else if(grdson > 0) { exit(0); } else { printf("fork grdson error.\n"); exit(0); } } else if (child > 0) { wait(); } else printf("fork() error\n"); sleep(60); return 0; }
View Code
执行以及查看结果:
XXXX> ./a.out child process id 13479 grdson process id 13480 XXXX> ps -ef | grep a.out 1000 13478 19733 0 00:41 pts/2 00:00:00 ./a.out 1000 13480 1 0 00:41 pts/2 00:00:00 ./a.out 1000 13482 25700 0 00:41 pts/0 00:00:00 grep a.out
孙子进程13480由init进程领养了
相关文章推荐
- Android 将图片平均切割成多张小片
- 使用maskView设计动画效果
- [转载] IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合
- 二 cocos2dx 之 解析xml文件数据并在程序中调用,存储
- iOS dSYM文件结构剖析(下)
- 二元关系的矩阵和图表示
- HDU 2157 How many ways?? (DP)
- vim 缩进设置
- C#高级编程七十二天----DynamicObject和ExpandoObject
- kafka-6
- iOS开发中常用的颜色及其对应的颜色值
- Java实现二维码QRCode的编码和解码
- ccui.ScrollView 扩展
- kafka管理器kafka-manager部署安装
- kafka管理器kafka-manager部署安装
- kafka管理器kafka-manager部署安装
- 比较正宗的验证邮箱的正则表达式js代码详解
- poj 1001 Exponentiation
- kafka管理器kafka-manager部署安装
- 关系:CGI,FastCGI,PHP-CGI与PHP-FPM