FILE * 和 int 值 fd 之间的 difference/relation 是什么?

What is the difference/relation between FILE * and int value fd?

我注意到在 C 语言中,文件 I/O 依赖于文件描述符。然而,在一些标准库函数中,如 write(int fd, xxxx),文件描述符似乎是一个整数,而在其他一些函数如 fseek(FILE *stream, xxxx) 中,它被表示为一个指针。

int 的 fd 值和 FILE * 的值相同吗?为什么C语言会留下这样的差异?

(我试图找到类似的问题但失败了,尽管我的问题似乎是初步的)

Are int valued fd and FILE * the same?

没有。他们不是。

文件描述符是一个 intFILE * 是一个文件指针。主要区别在于后者有缓冲而前者没有。

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

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

int fd = fileno(fp);

C 中的标准文件类型是 FILE *。您看到的任何使用 int fd 的函数都是扩展而不是标准 C。最常见的是 POSIX 扩展。

int 文件描述符的存在是因为底层内核使用它来描述文件。在那些使用文件描述符的系统上,FILE * 是文件描述符的包装器,添加缓冲等。但并非所有系统都使用文件描述符,例如我很确定 Windows 不会,尽管我没有'证实了这一点。在这些系统上,FILE * 包装了其他更合适的东西。