• Linux|僵死进程


    1.僵死进程产生的原因或者条件:

    什么是僵死进程?

    当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程.

    简而言之,就是子进程先结束,并且父进程没有获取它的退出码;

    那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取子进程的退出码;

    2.进程结束的过程以及僵死进程产生的过程:

    3.观察僵死进程:

    父进程执行7次,子进程改为3次;就能观察到僵死进程(放到后台运行&,ps -f);

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main()
    6. {
    7. char *s=NULL;
    8. int n=0;//控制父子进程执行的次数;
    9. pid_t id=fork();
    10. assert(id!=-1);
    11. if(id==0)//子进程
    12. {
    13. s="child";
    14. n=3;
    15. }
    16. else//父进程
    17. {
    18. s="parent";
    19. n=7;
    20. }
    21. //父子进程
    22. int i=0;
    23. for(;i
    24. {
    25. printf("s=%s\n",s);
    26. sleep(1);
    27. }
    28. exit(0);
    29. }

    4.处理僵死进程

    (1)父进程先结束(子进程会变成孤儿进程,孤儿进程会被收养(红帽子是init(pid==1)收养孤儿进程,Unbuntu是操作系统指定了一个进程));
    (2)父进程调用wait()方法获取子进程的退出码;

    本质:都是调用了wait方法;

    代码演示:

    方法一:父进程先结束//就是把父进程的n=3,子进程的n=7即可;

    方法二:显示的调用wait:

    1. else
    2. {
    3. s="parent";
    4. n=7;
    5. int val=0;
    6. wait(&val);
    7. printf("val=%d\n",val);
    8. }

    但是两种方法都有区别:就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会去执行;

    5.处理僵死进程的意义;

    僵死进程的坏处:白白消耗内存;(讲服务器代码的时候会演示)
    Linux内核设计与实现27页;

    6.退出码

    改代码:exit(3);
    执行显示val=768;
    man 2 wait

    WIFEXITED:正常退出的状态;
    WEXITSTATUS:获取退出码;

    1. else//父进程
    2. {
    3. s="parent";
    4. n=7;
    5. int val=0;
    6. wait(&val);
    7. if(WIFEXITED(val))
    8. {
    9. printf("val=%d\n",WEXITSTATUS(val));
    10. }
    11. }

    将退出码设为exit(3),未使用WIFEXITED(),WEXITSTATUS()之前。结果如下:

    使用WIFEXITED(),WEXITSTATUS()。结果如下:

    7.避免僵死进程的方法总结

    1)父进程先结束;

    2)父进程调用wait()方法获取子进程的退出码;
    其实两种处理僵死进程的方法本质都是一样的,都调用了wait获取子进程退出码(方法一是父进程先结束后子进程被Init(现在随着内核的发展不一定是1)收养,Init之后调用wait获取子进程退出码;方法二是父进程直接调用wait,)但是两种方法又有区别,就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会执行.

    若想父进程调用wait不阻塞,那么我们需要结合信号一起.具体在信号那一节用代码演示;

  • 相关阅读:
    我的NAS方案及使用的功能
    【毕业设计】基于php+mysql的成绩查询系统设计与实现(毕业论文+程序源码)——成绩查询系统
    ros远程订阅
    Postman如何做接口自动化测试?
    浅谈系统安全测试
    不使用 Javascript 也可以和浏览器进行交互?快来我这里看看!
    【算法3.5】Dijkstra求最短路(完结)
    链接装载与库:第八章——Linux共享库组织
    (附源码)ssm某村青年人口信息管理系统 毕业设计 271621
    Python 面试必看
  • 原文地址:https://blog.csdn.net/m0_62689947/article/details/134496824