在irb中执行下面的代码(没有前面的命令)将得到5。
f = File.open("./test.txt")
puts f.fileno文件描述符号0,1,2代表STDIN,STDOUT,STDERR。在红宝石中,3和4代表什么?
环境: Lubuntu 14.04 64位,Ruby1.9.3在rvm下。
发布于 2014-06-14 13:48:18
来自标准输入、输出和错误:
当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现在,让我们尝试使用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这些操作是不可能的,因为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)注意:在openSUSE13.1中,我的Ruby版本是-2.0.0-p 451。
发布于 2014-06-14 13:48:21
这不是真正的红宝石。你所拥有的每一件文件都有一个描述符。默认情况下,012被分配给您所提到的内容。当您打开更多的文件时,会为它们分配下一个可用的描述符。如果您尝试打开6个文件,它们都会得到不同的数字,如果您更改打开它们的顺序,它们将得到另一组数字。
如果您跳过其中一个,这可能意味着您的程序打开了另一个您没有意识到的文件。我的钱会花在一个或更多的红宝石图书馆上,但我不会发誓。
https://stackoverflow.com/questions/24220552
复制相似问题