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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 中,僵尸进程孤儿进程都是指与父进程不再有联系的进程,它们通常是由于进程管理不当或程序错误导致的。 **僵尸进程**是已经完成执行任务,但其父进程还没有来得及处理其退出状态的进程。当进程完成执行后,它的退出状态(也称为退出码或终止状态)会被保存在系统中,直到父进程通过 `wait` 或 `waitpid` 等函数来获取该状态。如果父进程没有处理该状态,那么该进程就会成为僵尸进程,占用系统资源。要清理僵尸进程,可以使用 `kill` 命令向其父进程发送 `SIGCHLD` 信号,或者重新编写程序,使其正确处理子进程的退出状态。 **孤儿进程**是指其父进程已经退出或被终止,但其自身仍在运行的进程。孤儿进程会被 `init` 进程(进程号为 `1`)接管,`init` 进程会定期检查系统中是否有孤儿进程,并且将其的父进程设置为 `init` 进程。要避免孤儿进程的产生,可以在父进程退出之前,等待子进程的退出,或者将子进程的父进程设置为 `init` 进程。 可以使用 `ps` 命令来查看系统中的僵尸进程孤儿进程。使用以下命令可以查看所有僵尸进程: ``` ps aux | grep 'Z' ``` 其中,`aux` 选项用于显示所有进程,`grep 'Z'` 用于查找所有状态为 `Z` 的进程,即僵尸进程。 使用以下命令可以查看所有孤儿进程: ``` ps -ejH ``` 其中,`-e` 选项用于显示所有进程,`-j` 选项用于以层次结构的形式显示进程,`-H` 选项用于显示所有孤儿进程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值