0

我正在尝试在 python 中使用 fork 编写套接字服务器。当客户端连接时,会以某种方式创建一个新的分叉,并且这个分叉进程将处理包括发送/接收在内的连接。
我在 Linux 上运行此脚本centOS并监视资源htop/top以查看显示了多少分叉(任务)。问题是当我使用os._exit(0)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)
4

1 回答 1

2

父进程需要等待子进程才能释放子进程的资源。在那之前,该进程仍然以“僵尸”状态存在,并且它仍然会出现在pstop

您可以调用os.wait()os.waitpid()os.wait3()或之一os.wait4()

os.wait3()使用该os.WNOHANG选项可能对您最有用,因为它将等待任何子进程并且父进程不会阻塞,直到子进程终止(或者它的状态更改 -wait也会返回已停止或重新启动的子进程)。

有关底层系统调用的更多详细信息,请参见 Linux 手册页:man 2 wait.

于 2016-02-18T11:22:29.703 回答