11

我正在研究 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。

4

5 回答 5

16

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

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

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

它是否在当前文件夹中重新显示文件?

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

如果我打印fd变量,它会打印 3。这是什么意思?

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

于 2012-08-31T12:07:16.383 回答
6

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

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

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

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

于 2012-08-31T11:58:08.180 回答
2

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

于 2012-08-31T12:03:18.127 回答
0

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

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

于 2012-08-31T12:04:22.590 回答
0

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

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

于 2012-08-31T12:04:45.200 回答