多个fork调用导致BlockingIOError

时间:2017-06-14 02:10:51

标签: python macos python-3.x fork

我正在搜索有关以下代码段错误的解释:

#!/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()

这将产生许多进程(在它们生成时退出的进程)。

这最终会导致BlockingIOError显示如下:

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

但是当os.waitpid电话被取消注释时,一切似乎都没问题。

为什么会出现此错误以及此waitpid调用可能会对此发生什么变化?

1 个答案:

答案 0 :(得分:1)

这是同样的问题whenever fork dies this way;错误消息就是EAGAIN向您传达的方式:

  1. 你的内存不足或
  2. 您已达到流程限制(例如RLIMIT_NPROC
  3. waitpid修复了它,因为它收获了僵尸子进程;在你这样做之前,这些过程会计入上限(它必须保留它们,以便父母可以查看终止信息)。

    您可以在its man page上看到各种fork错误代码。