我正在尝试使用python中的fork编写套接字服务器。不知何故,当客户端连接时,将创建一个新的fork,这个fork进程将处理包括发送/接收在内的连接
我在Linux centOS
上运行此脚本,并使用htop/top
监视资源,以查看显示了多少分叉(任务)。该
问题是当我通过使用os._exit(0)
杀死一些fork时htop不会被改变(自然它必须通过查杀叉子来减少)当我关闭python脚本时,每个东西都会恢复正常(Ram使用和任务) 。
所以当我使用os._exit(0)
杀死一些分叉时,我必须这样做,它会在htop
上影响另一方面释放所有资源,不要等到它自己的父亲被杀死了吗?登记/>
这是创建分叉的代码:
def test(sock):
//handle socket then return
for i in range (1000):
sock,addr=socket.accept()
pid=os.fork()
if pid==0:
test(sock)
os._exit(0)
elif pid !=-1:
os.waitpid(-1, os.WNOHANG)
答案 0 :(得分:2)
父进程需要等待子进程才能进行子进程。要发布的资源。在那之前,这个过程仍然存在于僵尸"状态,它仍会显示在ps
和top
等
您可以拨打os.wait()
,os.waitpid()
,os.wait3()
或os.wait4()
之一。
os.wait3()
选项的 os.WNOHANG
对您来说可能是最有用的,因为它会等待任何子进程,并且在子进程终止之前父进程不会阻塞(或者它的状态发生变化 - wait
将返回已停止或重新启动的子进程。
有关底层系统调用的更多详细信息,请参见Linux手册页:man 2 wait
。