我通常只使用文件描述符。我不确定如果链接到FILE *的fd用于其他用途,它是否将继续正常工作。 FILE *和与其链接的fd是否独立存在?
答案 0 :(得分:2)
是的,在POSIX系统上,fd支持FILE*
。关闭FILE*
将关闭fd。使用fd和FILE*
进行交织有可能破坏您的数据(FILE*
进行fd绕过的用户模式缓冲);您必须禁用缓冲(使用setvbuf
等),或确保在直接写入fd之前可靠地刷新了FILE*
。否则,只要没有关闭 fd,FILE*
就应该继续工作。
答案 1 :(得分:1)
我的问题主要来自看到使用fileno()获取该流的fd。那使我认为文件流以某种方式链接到了fd。
是。
<stdio.h>
中的函数通常被实现为较低级别的特定于OS的函数的包装。这需要一些簿记。标准的FILE
结构需要跟踪“操作系统如何引用流”(即,在POSIX系统上,文件描述符),还要跟踪与该流关联的任何缓冲区,并在这些缓冲区中建立索引,无论文件是需要在关闭(tmpfile()
之后删除,无论是否需要free()
d(因为库分配了它们)(因为用户分配了它们并通过{{ 1}}),流的多字节编码状态,从C11开始,为在操作期间锁定流以确保线程安全的互斥体。
setvbuf()
是POSIX专有的功能,用于从fileno()
结构中检索文件描述符,而在没有标准库知识的情况下对其进行任何访问。与操作系统相比,导致标准库函数对流的状态有一个不同的想法,这可能会使您的程序陷入困境。
除非您确切知道自己在做什么,否则请勿将POSIX和标准文件访问权混在一起。