RubyMonk - I / O Stream - “打开的文件过多”

时间:2015-08-05 16:18:50

标签: ruby io stream

我在RubyMonk Book 1 Ch 9.1上演示概念的默认代码是这样的。如何关闭打开的文件?显然我在回到它之后运行了这么多次,现在它返回了这个错误:

# open the file "new-fd" and create a file descriptor:
fd = IO.sysopen("new-fd", "w")

# create a new I/O stream using the file descriptor for "new-fd":
p IO.new(fd)

STDOUT:
class: Errno::EMFILE
message: Too many open files - new-fd
backtrace: RubyMonk:4:in `sysopen'

编辑:显然该网站正在使用FakeFS模拟文件创建/删除。这会导致异常行为,例如调用IO.methods不返回任何内容。链接到网站:https://rubymonk.com/learning/books/1-ruby-primer/chapters/42-introduction-to-i-o/lessons/89-streams

1 个答案:

答案 0 :(得分:1)

这里有两件事:

  • 泄漏文件句柄:如果你继续打开文件并且不关闭句柄/描述符,你将最终用尽句柄。每台机器/进程可以打开的文件数量通常是有限的(如果泄漏,最终会耗尽它们)。解决方案是在完成文件后停止泄漏并正确清理。
  • 需要您的系统当前允许的更多文件句柄:如果您合法地需要同时打开大量文件,即使您没有泄漏,也可能遇到上述限制。在这种情况下,我建议您查看限制是什么,并可能调整它们。首先使用Google搜索“ulimit linux”(例如:http://ss64.com/bash/ulimit.html