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下.
当程序由 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。
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |