IO.sysopen返回什么?

时间:2014-12-07 02:32:10

标签: ruby io

有人可以向我解释I / O吗?从我收集的所有内容中,可以概括地总结出计算机与人类交互的方式,反之亦然。 I / O通道或“如何”可以运行色域,具体取决于外部设备和/或内部OS管理。

那么Ruby中的IO类做什么?它与Java或C有什么不同?

并以此代码为例:

x = IO.sysopen("file_name")
p x

根据文件描述符返回Fixnum。在这种情况下,“file_name”是一个pdf文件并返回7.返回对象是什么意思?

1 个答案:

答案 0 :(得分:1)

首先,sysopen是一种与系统交互的非常低级的方式。对于Ruby中的正常输入和输出,您应该使用File.open代替。

sysopen返回的数字称为“文件描述符”。它本质上是数组的索引,但不是Ruby数组;它存在于由操作系统维护的进程内存部分内。第一个文件描述符,编号0,称为“标准输入”。默认情况下,输入调用将从此输入流中读取。第二个,称为“标准输出”;输出调用默认发送它们的输出。第三个,称为“标准错误”,这是错误消息的来源。在Ruby启动之前,所有这三个都是由操作系统打开的。通常它们都绑定到终端,但你可以通过shell重定向来改变它。

作为一般规则,当您打开一个额外的文件时,您打开的第一个文件将获得文件描述符3,接下来的4个,依此类推。因此,如果你得到7,那就意味着Ruby在到达你的代码时已经打开了4个其他文件。这就是它的意思。根据数字,您无法告诉任何有关打开文件的内容。你必须将该号码交给系统调用,该系统调用可以查看文件描述符数组以查看是什么。

但在Ruby中,您通常没有理由知道或关心文件描述符号。您处理IO类的实例(及其类File的子类,用于特定类型的I / O)。您可以调用IO对象上的方法,它们会为您处理系统调用的详细信息。预定义常量STDIN引用的对象(也是全局变量$stdin的初始值)知道其文件描述符为0,因此您不必知道。