输入时fd表示的是什么:int fd = open(“file”);?

时间:2012-08-31 11:55:41

标签: c++ file io

我正在研究C ++中的I / O操作,我有一个问题。 打开如下文件时:

#include <fcntl.h>
int main() {
    unsigned char buffer[16];     
    int fd = open (argv[1], O_RDONLY);
    read(fd, buffer, sizeof(buffer));
    return 0;
}

当将变量fd传递给open方法时,它如何将文件表示为整数?它是否重复当前文件夹中的文件?如果我打印'fd'变量,它会打印3.这是什么意思?

聚苯乙烯。我知道还有其他几种处理文件的方法,比如stdio.h,fstream等,但这超出了这个问题的范围。 DS。

5 个答案:

答案 0 :(得分:11)

  

当将文件传递给open方法时,变量fd如何将文件表示为整数?

它是一个标识打开文件的句柄;它通常被称为文件描述符,因此名称为fd

当您打开文件时,操作系统会创建一些访问它所需的资源。它们存储在某种使用整数作为键的数据结构(可能是一个简单的数组)中;对open的调用返回该整数,以便在传递read时,操作系统可以使用它来查找所需的资源。

  

是否重复当前文件夹中的文件?

它表示您打开的文件;它的文件名是argv[1],它是在程序启动时传递给程序的第一个参数。如果该文件不存在,或者open由于某种原因失败,那么它的值为-1并且不代表任何文件;在你尝试用它做任何事之前,你真的应该检查一下。

  

如果我打印fd变量,则打印3.这是什么意思?

它没有任何特别的意义;但它具有该值,因为它是在cincout使用的输入(0),输出(1)和错误(2)流之后打开的第四个文件(或类似文件的东西) C ++中的{1}}和cerr

答案 1 :(得分:6)

因为那是为当前流程存储的资源表的索引。

每个进程都有自己的资源表,因此您只需要将索引传递给read/write/etc函数

  
    

通常,文件描述符是内核驻留数据结构中包含所有打开文件详细信息的条目的索引。在POSIX中,此数据结构称为文件描述符表,每个进程都有自己的文件描述符表。用户应用程序通过系统调用将抽象密钥传递给内核,内核将根据密钥代表应用程序访问该文件。应用程序本身无法直接读取或写入文件描述符表。

  

来自:http://en.wikipedia.org/wiki/File_descriptor

答案 2 :(得分:2)

open()返回文件的文件描述符,它是C类型int。要了解有关文件描述符的更多信息,请参阅http://en.wikipedia.org/wiki/File_descriptor

答案 3 :(得分:0)

“fd”代表文件描述符。它是标识文件的值。它通常是索引(在全局表中),偏移量或指针。不同的API使用不同的类型。例如,WinAPI使用不同类型的句柄(HANDLE,HGDI等),它们实际上是int / void * / long的typedef,依此类推。

使用像“int”这样的裸体类型通常不是一个好主意,但如果实现告诉你这样做(如本例中的POSIX),你应该保留它。

答案 4 :(得分:0)

简化的答案是fd只是某些文件描述符数组的索引。

当大多数进程启动时,会给它们三个打开的​​文件描述符,以开始:stdin(0),stdout(1)和stderr(2)。因此,当您打开第一个文件时,下一个可用的数组条目是3。