我通常只使用文件描述符。我不确定如果链接到它的 fd 用于其他目的,FILE * 是否会继续正常工作。链接到它的 FILE * 和 fd 是否独立存在?
在 POSIX 系统上,是的,fd 支持FILE*
。关闭FILE*
将关闭 fd。交错使用 fd 和FILE*
可能会破坏您的数据(FILE*
执行 fd 绕过的用户模式缓冲);您必须禁用缓冲(使用setvbuf
等)或确保在直接写入 FD 之前可靠地刷新FILE*
。否则,只要没有任何东西关闭fd,FILE*
应该继续工作。
我的问题主要源于查看 fileno() 的用法来获取该流的 fd。这让我认为文件流以某种方式链接到 fd。
他们是。
<stdio.h>
中的函数通常作为较低级别、特定于操作系统的函数的包装器实现。这需要一些簿记。该标准的FILE
结构需要跟踪"操作系统如何引用流"(即,在POSIX系统上,文件描述符),以及与流关联的任何缓冲区,索引到这些缓冲区,关闭后是否需要删除文件(tmpfile()
),这些缓冲区是否需要free()
d(因为库分配了它们)或不(因为用户分配了它们并将它们与流相关联setvbuf()
)、流的多字节编码状态,以及自C11起的互斥锁,在操作过程中用互斥锁来锁定流,以确保线程安全。
fileno()
是一个特定于 POSIX 的函数,用于从FILE
结构中检索文件描述符,无需了解标准库即可访问该文件描述符。导致标准库函数对流状态的想法与操作系统不同,这可能会对您的程序玩得很开心。
不要混合使用 POSIX 和标准文件访问,除非您确切地知道自己在做什么。