如果与文件*链接的fd用于其他目的,文件*是否继续工作?

时间:2019-06-14 10:56:13

标签: c macos filestream file-descriptor

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

2 个答案:

答案 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和标准文件访问权混在一起。