select 返回管道可读,读时却报 EAGAIN 错,是怎么回事呢?

管道是非阻塞的,明明 select 说了可读,但是读的时候却返回 BlockingIOError: [Errno 11] Resource temporarily unavailable。我知道对于网络数据,是可能因为接收到数据之后发现校验和不对而丢弃,导致这种情况。可我这里是管道啊……

平台:Python 3.5 on Linux 4.8.4 x86_64
管道是这样创建的:pipe = os.open(path, os.O_RDONLY | os.O_NONBLOCK)
然后扔给子进程用。每次 select 到之后会读一次,然后再 select。

重现率很低。这个程序我用了很久,也就出现了这么一次。

这里可能有答案,但是我不是红帽订阅用户看不到……

阅读 3.7k
1 个回答

看了你的描述,我猜测会不会是资源不足引起的。是不是因为程序用了很久,子进程创建的太多,达到资源使用上限。然后被系统杀死,导致Resource temporarily unavailable 可以看一下你机器下ps aux| wc -l运行的进程数,然后看看机器的ulimit -u的数量。 如果无限接近或超过ulimit的数量有可能产生Resource temporarily unavailable问题。 这是我的猜测,希望能帮到你

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题