进程--特殊的进程

孤儿进程:

原因:由于 父进程 比 子进程 先结束退出掉,此时子进程将成为孤儿进程

孤儿进程不会一直存在,孤儿进程最终会被系统进程收养,此时系统进程就会成为孤儿进程的父进程,等孤儿进程结束退出后,系统进程就会自动处理掉。


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) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。

posted @ 2022-11-17 23:42  powfu  阅读(38)  评论(0)    收藏  举报