linux 僵尸进程和孤儿进程的简要介绍

进程?

即linux(类unix系统)对于运行的程序的一个抽象。

谈谈wait和waitpid

wait和waitpid是linux支持的两种system call(系统调用),是父进程获取子进程状态的方式。
头文件:

#include <sys/types.h>

#include <sys/wait.h>

函数原型:

  • pid_t wait (int *status)
  • pid_t waitpid(pid_t pid,int * status,int options)

wait()

wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则status可以设成NULL

waitpid()

waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用waitpid()子进程已经结束,则waitpid()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码

pid: 当pid为-1时等待任一进程,(相当于和wait差不多),为0则等待和当前进程id一样的,如果为其他负值,则取绝对值,再等待该pid所指定的进程。
options: 为0,或为WNOHANG和WUNTRACED的or组合。

WNOHANG:如果没有任何已经结束的子进程则马上返回,不予以等待。此时返回值为0

WUNTRACED:如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会

status状态值

对status状态判断的宏定义:

  • WIFEXITED(status) 如果子进程正常结束返回的值。取exit或_exit的低8位
  • WEXITSTATUS(status) 取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才使用此宏
  • WIFSIGNALED(status) 当子进程因为信号而结束则返回true
  • WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏
  • WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况
  • WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED来判断后才使用此宏

谈谈僵尸进程和孤儿进程

根据以上的资料,我们知道了wait和waitpid的用法,可以说waitpid用来等待特定进程,而wait等待任一进程(waitpid也可以等待任一进程,如果只是需要option的区别的话)。

首先,linux通过父进程来创建子进程,父进程通过wait/waitpid来得到子进程的运行状态,当子进程运行完之后,父进程得到子进程的状态,进行接下来的工作。

那么问题来了,如果父进程一直不愿意调用wait/waitpid呢?

子进程在运行完毕之后是不会完全被销毁掉的,而是会保留一些基础数据:
(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)

僵尸进程则是说的这样一类进程,父进程只管创建,不管回收(一直没有调用wait/waitpid,但是父进程本身又没有结束),子进程就进入僵尸进程状态,标识为Z(zombie)。
孤儿进程则与之对应,说的是父进程不管回收,但是父进程自己死掉了(本身结束了),于是子进程就会被init进程接管,init进程会一直循环wait来将子进程彻底释放掉。

危害?影响?

孤儿进程没有较大影响,毕竟该子进程会被init很快就回收掉,但是僵尸进程就不同了,由于进程号有限,在进程号使用完之后,会导致无法创建新的进程,所以一定要注意处理僵尸进程。

引用:

http://blog.csdn.net/guoping16/article/details/6583466
http://blog.csdn.net/guoping16/article/details/6583466

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值