FILE *和int值fd之间的区别/关系是什么?

3
我注意到在C语言中,文件I/O依赖于文件描述符。然而,在一些标准库函数中(如write(int fd, xxxx)),文件描述符似乎是一个整数,而在另一些函数中(如fseek(FILE *stream, xxxx)),它表示为一个指针。 int类型的fd和FILE *类型是否相同?为什么C语言会留下这样的差异?
(我试图寻找类似的问题,但失败了,尽管我的问题似乎很初步)

1
int类型的fd和FILE *是相同的吗?如果它们的类型不同,它们怎么可能是相同的呢?至于“为什么C语言会留下这种差异?”:实际上是没有留下的。C标准库只使用FILE结构。整数文件描述符是POSIX的产物,与标准C完全无关。 - The Paramagnetic Croissant
抱歉我的问题可能有点混淆...但我真的想知道为什么有些函数需要 int fd 而有些函数需要 FILE *stream - xywang
2
@TheParamagneticCroissant,你的评论可能被解释为傲慢无礼;也许你可以注意措辞(像“你甚至考虑过这个吗”这样的句子对任何人都没有帮助)。 - MicroVirus
FILE * 不是文件描述符。 - Iharob Al Asimi
2个回答

12

整型的 fd 和文件指针 FILE* 是相同的吗?

不是。它们并不相同。

文件描述符是一个整型(int),而文件指针(FILE*)是一个文件指针。主要的区别在于后者是带缓冲的,而前者则没有。

文件指针(FILE*)通常包含有关流的更多信息,例如当前位置、文件结束标记、流中的错误等等。但文件描述符只是表示“文件”(可以是管道、套接字或任何其他流)的正整数。

您可以使用 fileno() 从文件指针中获取文件描述符:

int fd = fileno(fp);

2
+1 表示将 FILE* 转换为 int fd 的转换方式,但是应该注意不要这样做,因为在调用 int fd 上的 read/write/seek 后很容易使缓冲区无效,从而破坏使用 FILE* 的功能。 - Serge Rogatch

9
在C语言中,标准的文件类型是FILE *。任何使用int fd的函数都是扩展而不是标准的C函数。最常见的扩展是POSIX扩展。 int文件描述符存在是因为它是底层内核用来描述文件的方式。在使用文件描述符的系统上,FILE *是一个文件描述符的包装器,添加了缓冲等功能。但并非所有系统都使用文件描述符,例如我很确定Windows没有使用文件描述符,但我没有验证过。在这些系统上,FILE *会包装其他更合适的东西。

1
对于Windows系统,它们大多数是指针类型,因为在C语言中这样实现是很实用的。它们唯一与指针有关的是它们在C语言中的类型。对于所有其他意图和目的,它们都是描述符,就像“int”文件描述符一样。 - MicroVirus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接