linux 进程之僵尸进程与孤儿进程

       1: 想知道运行的进程是什么意思,就需要知道进程的不同状态 一个进程可以有几个1状态 (在linux内核里,进程有时候也叫作任务)。
在linux环境中通常有如下进程状态
       R (running)    //运行状态 表明进程要么是在运行中要么在运队列。
      S (sleeping)    //浅度睡眠状态
      D (disk sleep) //不可中断睡眠状态 此状态只能自己醒过来,在这个状态的进程通常会等待IO的结束。
      T (stopped)    //停止状态
      X (dead)       //死亡状态
      Z (zombie)    //僵尸状态 此进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
      图片:

2: 孤⼉进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被 init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
   僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取紫禁城的状态,那么子进程的进程描述仍然保存在系统中

孤儿进程验证程序如下:
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>

 int main()
{
     pid_t pid;
     //创建一个进程
     pid = fork();
    //创建失败
         if (pid < 0)
              {
                       perror("fork error:");
         exit(1);
              }
     //子进程
     if (pid == 0)
     {
         printf("I am the child process.\n");
         //输出进程ID和父进程ID
         printf("pid: %d\tppid:%d\n",getpid(),getppid());
         printf("I will sleep five seconds.\n");
                  //睡眠5s,保证父进程先退出
         sleep(5);
         printf("pid: %d\tppid:%d\n",getpid(),getppid());
         printf("child process is exited.\n");
     }
     //父进程
     else
     {
         printf("I am father process.\n");
         //父进程睡眠1s,保证子进程输出进程id
         sleep(1);
         printf("father process is  exited.\n");
     }
     return 0;
 }
孤儿进程测试结果如下: 


僵尸进程验证程序如下:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

  int main()
  {
      pid_t pid;
      pid = fork();
     if (pid < 0)
     {
         perror("fork error:");
         exit(1);
     }
     else if (pid == 0)
    {
             printf("I am child process.I am exiting.\n");
         exit(0);
     }
     printf("I am father process.I will sleep two seconds\n");
     //等待子进程先退出
     sleep(2);
     //输出进程信息
     system("ps -o pid,ppid,state,tty,command");
     printf("father process is exiting.\n");
     return 0;
 }

僵尸进程测试结果如下:

危害
在lunix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。
处理方法
1. 将父进程杀死,使僵尸进程成为孤儿进程,让init进程收养,清理僵尸进程.它产生的所有僵尸进程也跟着消失。
2. 子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值