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

来源:互联网 发布:水性科天板材 知乎 编辑:程序博客网 时间:2024/04/28 15:02
       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
原创粉丝点击