僵尸进程

僵尸进程(Zombie process)

泪湿孤枕 提交于 2019-12-21 00:29:47
以下内容有一部分摘自百度百科,一部分摘自《UNIX环境高级编程》           一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的 数据结构 (系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何 可执行代码 ,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的 父进程 来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸.   怎么查看 僵尸进程 :   利用命令ps,可以看到有标记为Z的进程就是僵尸进程。   怎样来清除 僵尸进程 :   1.改写 父进程 ,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后

僵死进程

大城市里の小女人 提交于 2019-12-21 00:28:55
我是从:http://blog.csdn.net/hwz119/archive/2007/05/16/1612223.aspx 转载过来的,他从哪里转过来的,就不得而知了。 解释得比较搞笑!!! 僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程   怎样产生僵尸进程的:   一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。    在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位 置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了, 那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。  

UNIX网络编程——僵尸进程

那年仲夏 提交于 2019-12-21 00:28:24
在fork()/exec()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。 定义: 在unix术语中, 一个已经终止但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程称为僵尸进程(zombie)。 产生: 怎样产生僵尸进程的: 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度, 仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集, 除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束

UNIX网络编程——僵尸进程

别来无恙 提交于 2019-12-21 00:27:53
在fork()/exec()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。 定义: 在unix术语中, 一个已经终止但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程称为僵尸进程(zombie)。 产生: 怎样产生僵尸进程的: 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度, 仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集, 除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束

linux下的僵尸进程处理SIGCHLD信号

末鹿安然 提交于 2019-12-21 00:22:18
什么是僵尸进程 ? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。 而僵尸进程就是指:一个进程执行了exit系统调用退出,而其父进程并没有为它收尸(调用wait或waitpid来获得它的结束状态)的进程。 任何一个子进程(init除外)在exit后并非马上就消失,而是留下一个称外僵尸进程的数据结构,等待父进程处理。这是每个子进程都必需经历的阶段。另外子进程退出的时候会向其父进程发送一个SIGCHLD信号。 僵尸进程的目的? 设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程)。继承这些子进程的init进程将清理它们(也就是说init进程将wait它们,从而去除它们的僵尸状态)。 如何避免僵尸进程? 通过signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心,由内核回收

进程的了解与僵尸进程的实现

戏子无情 提交于 2019-12-21 00:17:37
进程概念:程序的一个执行实例,正在执行的程序等 内核观念:担当分配系统资源(CPU时间,内训存)的实体 查看进程:   进程存放在根目录下的proc文件中,可以通过/proc系统文件查看:     使用ps aux | grep test   通过系统调用创建进程—fork(在创建子进程的时候其实是复制了task_struct)   fork有两个返回值:返回值为大于0为:父进程  返回值等于0:子进程  返回值等于-1:创建失败   fork创建出来的父子进程代码共享,但数据独有(数据各自开辟空间,私有一份)    进程状态:   R:运行状态(并不意味着进程一定在运行,表示在队列中或者运行中)   S:睡眠状态(意味着进程在等待事件的完成,也叫可中断状态)   T:停止状态(可以通过发送信号SIGSTOP信号给进程来停止进程,也可以通过信号继续)   X:死亡状态(只是一个返回状态,你不会在列表中看到这个状态)   Z:僵尸状态(当进程退出并且父进程没有读取到子进程的退出返回代码时就会产生僵尸进程) 实现僵尸进程:   代码如下,我们将子进程睡10 秒后退出,然后查看进程的状态      在复制一个SSH渠道,在页面中输入ps aux | head -n 1 && ps aux | grep fork 用来查看进程的状态   在运行了10 秒后,子进程退出,则进入僵尸状态  

Linux查找并杀死僵尸进程

萝らか妹 提交于 2019-12-12 12:43:51
当子进程执行完毕退出后, 父进程需要调用wait命令来读取子进程的退出状态, 并将子进程从进程表中移除. 如果父进程未能读取到子进程的Exit信号, 该子进程并不会从进程表中移除, 即处于僵尸状态Z. 僵尸进程不做任何事情, 不占用任何资源(CPU和内存), 也不会影响其他进程. 但是僵尸进程的一些进程信息依然保存在系统进程表中, 占用些许内存. 同时还占用了进程ID, 当僵尸进程数量太多了, 会导致后续系统进程ID分不出来而创建进程失败. 可以使用如下命令找出僵尸进程: 僵尸进程不能被kill掉, 要清除僵尸进程必须将其父进程杀死, 使僵尸进程成为孤儿进程, 孤儿进程将被init进程接管, init进程会wait进程的退出状态并清理进程表. 来源: https://www.cnblogs.com/cristiano-duan/p/12028006.html

僵尸进程,孤儿进程

孤街浪徒 提交于 2019-12-10 01:29:37
僵尸进程和孤儿进程是父进程不调用wait时子进程可能的两个状态。 僵尸进程:僵尸进程是指子进程结束运行(exit(0)), 系统将会保留子进程的描述符信息(没有被回收,其他进程不可以重用该描述符),而父进程没有调用wait对退出的子进程进行处理。子进程成为僵尸进程。查看命令ps打印其state可将有Z标志。 孤儿进程:父进程没有调用wait等待子进程退出。父进程结束后,子进程仍然在运行,此时子进程成为孤儿进程。孤儿进程会被init进程捕获到,并将init进程作为自己的父进程,此时所有的清除操作将会交给init进程(init进程循环调用wait)。 因此,孤儿进程是无害的。 解决僵尸进程的编程方法:首先父进程调用signal注册一个一个信号处理函数处理信号SIGCHILD: signal(SIGCHILD, call_back),call_back中调用wait_pid. 子进程在退出时会发出SIGCHILD,被父进程捕获后会调用call_back,完成对子进程描述符的回收操作, void call_back(int signo); int main() { signal(SIGCHILD, call_back); int pid = fork(); if(pid==0) { //son thread; exit(0) } else { //father thread; /

centos snippets - 悬念的博客

我怕爱的太早我们不能终老 提交于 2019-12-05 10:41:17
网络相关 查看网段可用 IP sudo nmap -v -sn -n 192.168.1.0/24 -oG - | awk '/Status: Down/{print $2}' 参考 Nmap: find free IPs from the range 进程、线程相关 查看僵尸进程 使用 top 查看有多少个僵尸进程 使用 ps 查看哪些是僵尸进程 ps -e -o stat,ppid,pid,cmd | grep -e '^[Zz]' 大专栏 centos snippets - 悬念的博客 code> 查看线程个数 查看当前系统允许的最大进程数,最大线程数,单独用户最大进程数 cat /proc/sys/kernel/pid_max cat /proc/sys/kernel/thread_max ulimit -u 来源: https://www.cnblogs.com/liuzhongrong/p/11921229.html

僵尸进程与孤儿进程你真的了解吗?

☆樱花仙子☆ 提交于 2019-12-05 05:36:29
今天在书上看到了 “僵尸进程与孤儿进程”的描述,又查看了一些资料,对这两种进程又多了点认识,这里简要记录下。 这两种进程粗看好像是差不多的,因为都有可能会被init进程回收,但是总的来说还是有点不一样,不管从产生的方式和危害程序都是不一样的。 僵尸进程与孤儿进程的产生 僵尸进程:子进程先结束,然后父进程又不管他,init进程来管理回收。 孤儿进程:父进程先结束,子进程找不到父了,init进程来回收。 僵尸进程回收:把父进程杀死,然后就由init回收了。 所以,僵尸进程与孤儿进程的产生就看是父进程还是子进程先结束。 僵尸进程 子进程结束时,父进程没有对子进程进行等待,不管他的死活。如果程序中父进程能正常结束还好,因为一旦子进程找不到它的父的话,会由init进程接管进行回收处理。 最悲剧的是,一般父进程都是挂一个循环在那里,不会结束的,这个时候系统发现你的父进程还存在的,然后init就不会管你,就产生僵尸进程了,而且如果产生太多会浪费大量的系统资源。 僵尸进程也不能用kill杀死,因为他的进程已经死了。 以下程序会产生僵尸进程,父进程没有等待子进程。通过ps -ef中,能看到 表示僵尸进程 <?php $pid = pcntl_fork(); if ($pid == -1) { die('fork error'); } else if ($pid > 0) { echo "I'm