孤儿进程:
原因:由于 父进程 比 子进程 先结束退出掉,此时子进程将成为孤儿进程
孤儿进程不会一直存在,孤儿进程最终会被系统进程收养,此时系统进程就会成为孤儿进程的父进程,等孤儿进程结束退出后,系统进程就会自动处理掉。
from time import sleep
import os,sys
def f1():
for i in range(3):
sleep(1)
print("写代码")
def f2():
for i in range(4):
sleep(1)
print('测代码')
pid = os.fork()
if pid < 0:
print('error')
elif pid == 0:
child_pid = os.fork() #在子进程中再创建子进程
print(os.getpid())
if child_pid < 0:
print('error')
elif child_pid == 0:
f2()
print(os.getppid())
else: #子进程直接退出,让孙进程成为孤儿进程
sys.exit()
else:
f1()
最后成为孤儿进程后,孙子进程的父进程编程1,1表示的就是系统进程
--僵尸进程
原因:子进程先比父进程结束退出,但是父进程没有对进程回收。此时子进程就是僵尸进程。子进程虽然结束了,但是会存在部分信息在内存中,大量的僵尸进程堆积就会占用系统的大量的资源。
解决办法:
1、父进程使用os.wait()阻塞函数将父进程挂起。
缺点:由于使用阻塞函数需要等子进程结束后,才能执行父进程,导致父进程被挂起,效率低下
2、创建二级子进程
【1】 父进程创建子进程,等待回收子进程
【2】 子进程创建二级子进程然后退出
【3】 二级子进程称为孤儿,和原来父进程一同执行事件
3、通过操作系统信号处理sign进程退出
如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
标签:特殊,结束,孤儿,--,pid,print,进程,os From: https://www.cnblogs.com/powfu/p/16901754.html