• 僵尸进程和孤儿进程


    僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程
    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
    等待父进程正常结束后会调用wait/waitpid去回收僵尸进程
    但如果父进程是一个死循环,永远不会结束,那么该僵尸进程就会一直存在,僵尸进程过多,就是有害的
    解决方法一:杀死父进程
    解决方法二:对开启的子进程应该记得使用join,join会回收僵尸进程
    创建完子进程后,主进程所在的这个脚本就退出了,当父进程先于子进程结束时,子进程会被init收养,成为孤儿进程,而非僵尸进程
    import os
    import sys
    import time
    
    pid = os.getpid()
    ppid = os.getppid()
    print 'im father', 'pid', pid, 'ppid', ppid
    pid = os.fork()
    #执行pid=os.fork()则会生成一个子进程
    #返回值pid有两种值:
    #    如果返回的pid值为0,表示在子进程当中
    #    如果返回的pid值>0,表示在父进程当中
    if pid > 0:
        print 'father died..'
        sys.exit(0)
    
    # 保证主线程退出完毕
    time.sleep(1)
    print 'im child', os.getpid(), os.getppid()
    
    执行文件,输出结果:
    im father pid 32515 ppid 32015
    father died..
    im child 32516 1
    
    子进程已经被pid为1的init进程接收了,所以僵尸进程在这种情况下是不存在的,存在只有孤儿进程而已,孤儿进程声明周期结束自然会被init来销毁。
    举例
  • 相关阅读:
    make menuconfig显示错误“Your display is too small to run Menuconfig!”
    程序员的那点事(转自java老师李明志)
    不必太羡慕别人
    把数据存储到 XML 文件
    关于session
    网页中的服务器端和客户端脚本
    没有一种成功是不经历磨砺的
    考试导数据总结(一)
    我们应该爱上“犯错”——读应试教育的死穴,恰在于堵死了孩子“犯错”的空间
    软考——多媒体
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/11235537.html
Copyright © 2020-2023  润新知