• 僵尸进程情景和简单总结


    情景:在gdb调试的过程中,强制退出了,出现的问题。具体在哪一步出的错,没有记录,需要后期总结一下。如图:

    第一个箭头是进程名,后面显示当前进程失效。

    以下内容是从别人的文章里转载过来的,有时间可以完善一下:

    1.linux系统进程都是怎么生成的

    进程运行时,shell命令行接收到了指令,进而调用fork函数来创建一个进程。

    2.僵尸进程是怎么产生的

    当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了,init进程会自动接收这个子进程,为它收尸,但如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态。
    进程状态:

    • Z 僵尸
    • S 休眠
    • D 不可中断的休眠
    • R 运行
    • T 停止时跟踪

    3.僵尸进程会造成内存泄露吗,应该怎么处置僵尸进程

    如果父进程是一个循环,子进程无人接收,会造成一部分内存浪费。
    此时可以杀死僵尸进程的父进程,让init进程自动回收这个僵尸进程。

    4.僵尸进程在内存中还存在吗?

    僵尸进程的状态:
    一个进程在调用exit()函数结束时,并没有真正的被销毁,而是留下一个称为僵尸进程的数据结构,僵尸进程放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保持一个位置,记载该进程的退出状态等信息。

    5.怎样避免僵尸进程

    • 使用signal函数显式忽略SIGCHLD信号;
    • 调用wait或者waitpid()函数;
    • fork两次,父进程fork子进程后继续执行,子进程fork一个孙进程后退出,此时孙进程会被init进程接管,避免僵尸进程,当然子进程的退出还是要进行处理的;

    6.wait函数和waitpid函数

    头文件:

    #include <sys/types.h>
    #include <sys/wait.h>
    pid_t wait(int *status);
    

    wait函数会暂时停止目前进程的执行,直到有信号来到或者子进程结束。
    如果在调用wait函数时,子进程已经结束,则会立即用status返回子进程状态值,返回值则是子进程的进程识别码,如果不需要子进程状态值,则status入参可为NULL;

    pid_t waitpid(pid_t pid, int *status, int options);
    

    参数说明:
    pid 欲等待的子进程识别码,值说明如下:

    • pid < -1 等待进程组识别码为pid绝对值的任何子进程;
    • pid = -1 等待任何子进程,相当于wait;
    • pid = 0 等待进程组识别码与目前进程相同的任何子进程
    • pid > 0 等待任何子进程识别码为pid的子进程

    options 有以下几种值:

    • WNOHANG 即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去
    • WUNTRACED 子进程进入暂停则马上返回,但结束状态不予以理会;
      当不想使用options时,可设为0;


    转自———作者:晟夏的叶
    链接:https://www.jianshu.com/p/2fa847da27cb
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    ACM第六周竞赛题目——A LightOJ 1317
    数学概念——J
    数学概念——I
    数学概念——D 期望
    数学概念——A 几何概型
    数学概念——E 期望(经典问题)
    数学概念——F 概率(经典问题)birthday paradox
    数学概念——H 最美素数
    数学概念——G 最大公约数
    UVa1328
  • 原文地址:https://www.cnblogs.com/coreLeo/p/11758884.html
Copyright © 2020-2023  润新知