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



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

相关内容

  • 没有找到相关文章

最新更新