zoukankan      html  css  js  c++  java
  • 僵死进程(1):如何防止僵尸进程的出现?

    僵尸进程(zombie process):在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中运行的所有进程, 看有没有哪个进程是【刚刚结束的这个进程】的子进程,如果是的话,就由Init 来接管他,成为他的父进程.

    1)父进程先于子进程终止:
    此种情况就是我们前面所用的孤儿进程。当父进程先退出时,系统会让init进程接管子进程 。
    
    2)子进程先于父进程终止,而父进程又没有调用wait或waitpid函数
    此种情况子进程进入僵死状态,并且会一直保持下去直到系统重启。子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需。此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数。
    
    僵死状态:一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为僵死进程(zombie)。ps命令将僵死进程的状态打印为Z 。
    
    3)子进程先于父进程终止,而父进程调用了wait或waitpid函数 
    此时父进程会等待子进程结束。

    下面的程序就演示了如何通过wait调用来获取子进程退出状态。

    在用户第一次回车之前,通过ps命令,应该可以看到子进程是 defunct 状态 (也就是zombie态),而一旦按下回车,wait被调用,此时通过ps命令就无法看到那个zombie了。所以防止zombie process的方法就是通过wait/waitpid等调用来解决。

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <stdlib.h>
     4 
     5 int main()
     6 {
     7     //child process
     8     int pid;
     9     pid = fork();
    10     if (pid == 0)
    11     {
    12         printf("This is child process, pid=%d,bye!
    ", getpid());
    13         exit(0);
    14     }
    15 
    16     sleep(1);
    17     printf("Press return to remove zombie process
    ");
    18     getchar();
    19 
    20     /*parent process must wait on child process to prevent zombie*/
    21     wait(NULL);
    22     printf("Press return to exit
    ");
    23     getchar();
    24 
    25     return 0;
    26 }

    执行结果:

    关于孤儿进程与僵尸进程总结:http://www.cnblogs.com/Anker/p/3271773.html

  • 相关阅读:
    【转载】opencvVS2019配置方法
    windows.h头文件中改变光标位置的函数——SetConsoleCursorPosition
    五行代码解决猴子选大王问题
    AtCoder Beginner Contest 192
    ACM做题注意事项
    数据库部分重点
    数据库7-11章期末复习
    数据库4-6章期末复习
    数据库1-3章期末复习
    ICPC Central Russia Regional Contest (CRRC 19)
  • 原文地址:https://www.cnblogs.com/bitter-first-sweet-last/p/3947777.html
Copyright © 2011-2022 走看看