Linux僵尸進程詳細解析。附ps常見用法。

僵尸进程是指的父进程已经“異常退出”,而子进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程,

注意,是針對子進程來講的,而不是父進程。
怎样产生僵尸进程的:
     一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。

    由此看出,僵尸進程并不會佔用很多的資源。唯一的危害是影響了系統最大進程數。

如何查看僵尸進程?

ps auwx;發現僵尸進程的狀態為Z。

ps axf;看進程數,以樹的方式。

ps auwx | cut -c 10-15,45-50,63- | grep -i Z 查看僵尸進程pid、名稱和進程路徑。

應用實例:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

const char cmd_init[]="ps -o pid,ppid,state,tty,command";

int main(int argc,char **argv)
{
        pid_t   pid;

        if((pid=fork()) < 0){
                exit(-1);
        }
        else if(pid==0){  /* 子進程exit */
                exit(0);
        }

        sleep(5);
        system(cmd_init);

        exit(0);
}

後臺運行此程序。

./a.out &

總結

1.父進程先於子進程退出,子進程的狀態是 "zombie" 僵尸狀態。

    如果父進程正常終止,子進程執行完畢之後會跟著消亡;

    如果父進程是異常終止,則子進程被託管給init進程,而子進程的狀態則會一直是僵尸進程狀態!

2.子進程先於父進程退出,這是很正常的情況了。子進程退出之後,父進程尚未退出,等待父進程退出的時候,定會收拾子進程的信息。

   因此不會有什麽僵尸進程只說。但是,如果父進程異常退出,那麼子進程依然會是僵尸進程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值