首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby中,文件描述符3和4代表什么?

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

Stack Overflow用户
提问于 2014-06-14 13:43:42
回答 2查看 1.2K关注 0票数 6

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

代码语言:javascript
复制
f = File.open("./test.txt")
puts f.fileno

文件描述符号012代表STDINSTDOUTSTDERR。在红宝石中,3和4代表什么?

环境: Lubuntu 14.04 64位,Ruby1.9.3在rvm下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-14 13:48:18

来自标准输入、输出和错误

当shell启动时,程序继承三个打开的文件,其中文件描述符为0、1和2,称为标准输入、标准输出和标准错误。在默认情况下,所有这些都连接到终端,因此如果程序只读取文件描述符0并写入文件描述符1和2,则可以进行I/O操作,而不必打开文件。如果程序打开任何其他文件,它们将具有文件描述符3、4等。

更新

代码语言:javascript
复制
$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方法从文件描述符读取文件名。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2014-06-14 13:48:21

这不是真正的红宝石。你所拥有的每一件文件都有一个描述符。默认情况下,012被分配给您所提到的内容。当您打开更多的文件时,会为它们分配下一个可用的描述符。如果您尝试打开6个文件,它们都会得到不同的数字,如果您更改打开它们的顺序,它们将得到另一组数字。

如果您跳过其中一个,这可能意味着您的程序打开了另一个您没有意识到的文件。我的钱会花在一个或更多的红宝石图书馆上,但我不会发誓。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24220552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档