如果链接到它们的 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 和标准文件访问,除非您确切地知道自己在做什么。
我通常只使用文件描述符。如果链接到它的 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 和标准文件访问,除非您确切地知道自己在做什么。