文件描述符3和4在Ruby中代表什么?

ish*_*no1 5 ruby file-descriptor

执行下面的代码irb(没有前面的命令)将得到5.

f = File.open("./test.txt")
puts f.fileno
Run Code Online (Sandbox Code Playgroud)

文件描述符0,1,2代表STDIN,STDOUT,STDERR.红宝石中3和4代表什么?

环境:Lubuntu 14.04 64位,红宝石1.9.3在rvm下.

Aru*_*hit 3

标准输入、输出和错误

当程序由 shell 启动时,它会继承三个打开的​​文件,文件描述符为 0、1 和 2,分别称为标准输入、标准输出和标准错误。所有这些默认情况下都连接到终端,因此如果程序仅读取文件描述符 0 并写入文件描述符 1 和 2,则无需打开文件即可执行 I/O。如果程序打开任何其他文件,它们将具有文件描述符 3、4 等。

更新

$stdin.fileno    # => 0
$stdout.fileno   # => 1
$stderr.fileno # => 2
File.open('test1').fileno # => 7
File.open('test2').fileno # => 8
File.open('test.txt').fileno # => 9
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试使用方法从文件描述符中读取文件名for_fd

File.for_fd(7) # => #<File:fd 7> # refers file test1
File.for_fd(8) # => #<File:fd 8> # refers file test2
File.for_fd(9) # => #<File:fd 9> # refers file test.txt
Run Code Online (Sandbox Code Playgroud)

Opps!,这些是不可能的,因为RubyVM使用文件描述符 3,4,5,6 。

File.for_fd(3) # => 
# The given fd is not accessible because RubyVM reserves it (ArgumentError)
File.for_fd(4) # => 
# The given fd is not accessible because RubyVM reserves it (ArgumentError)
File.for_fd(5) # => 
# The given fd is not accessible because RubyVM reserves it (ArgumentError)
File.for_fd(6) # => 
# The given fd is not accessible because RubyVM reserves it (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

注意:我的 Ruby 版本是openSUSE13.1中的- 2.0.0-p451