如果链接到它们的 fd 用于其他目的,FILE * 是否继续工作?

Do FILE * continue to work if the fd linked to them is used for some other purpose?

我通常只使用文件描述符。如果链接到它的 fd 用于其他目的,我不确定 FILE * 是否会继续正常工作。 FILE *和链接到它的fd是独立存在的吗?

在 POSIX 系统上,是的,fd 支持 FILE*。关闭 FILE* 会关闭 fd。交错使用 fd 和 FILE* 有弄乱数据的风险(FILE* 执行 fd 绕过的用户模式缓冲);您必须禁用缓冲(使用 setvbuf 等)或确保 FILE* 在任何内容直接写入 fd 之前可靠地刷新。否则,只要没有 关闭 fd,FILE* 应该继续工作。

My question mainly originates seeing usage of fileno() to get a fd for that stream. That made me think that file streams are linked to fd somehow.

他们是。

<stdio.h> 中的函数通常作为 lower-level、OS-specific 函数的包装器实现。这需要一些簿记。标准的 FILE 结构需要跟踪 "how the OS refers to the stream"(即,在 POSIX 系统上,文件描述符),而且还需要跟踪与流关联的任何缓冲区、这些缓冲区的索引、文件是否需要在关闭后删除 (tmpfile()),无论这些缓冲区是否需要 free()d(因为库分配了它们)或不需要(因为用户分配了它们并通过 [= 将它们与流相关联) 14=]),流的多字节编码状态,以及自 C11 起,在操作期间锁定流以确保 thread-safety.

的互斥锁

fileno() 是一个 POSIX-specific 函数,用于 FILE 结构 中检索文件描述符,无需标准库的知识。导致标准库函数对流的状态有一个不同的想法,而不是操作系统,这可能会让你的程序玩得很开心。

不要混合使用 POSIX 和标准文件访问,除非您确切地知道自己在做什么。