多次 fork 调用会导致 BlockingIOError

vmo*_*eco 6 python macos fork python-3.x

我正在寻找有关以下代码片段中出现的错误的解释:

#!/usr/bin/env python3

import os, sys

if __name__ == '__main__':
    while True:
        pid = os.fork()
        if pid == 0:
            sys.exit()
        elif pid > 0:
            pass
            # os.waitpid(pid, 0)
        else:
            sys.exit()
Run Code Online (Sandbox Code Playgroud)

这将产生许多进程(产生时退出的进程)。

这最终会导致BlockingIOError这样的显示:

Traceback (most recent call last):
  File "./asd.py", line 7, in <module>
    pid = os.fork()
BlockingIOError: [Errno 35] Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)

但是当os.waitpid调用没有注释时,一切似乎都很好。

为什么会发生此错误以及此waitpid调用可能会改变什么?

Sha*_*ger 7

每当以fork这种方式死亡时,都会出现同样的问题;错误消息就是这样EAGAIN传达给您的:

  1. 你失忆了或者
  2. 您已达到进程限制(例如RLIMIT_NPROC

waitpid修复它,因为它获取僵尸子进程;在您这样做之前,这些进程将计入上限(它必须保留它们,以便父进程可以查看终止信息)。

您可以在其手册页上查看记录的各种fork错误代码。