【问题标题】:Do FILE * continue to work if the fd linked to them is used for some other purpose?如果链接到它们的 fd 用于其他目的,FILE * 是否继续工作?
【发布时间】:2019-06-14 10:56:13
【问题描述】:

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

【问题讨论】:

  • C 规范中没有任何内容将FILE 流与与文件描述符相关的任何内容链接起来。文件描述符是文件句柄的操作系统特定实现,通常用于 POSIX 系统(如 Linux 和 macOS)。 Windows 可能会改用特定于 Windows 的 HANDLEFILE 是一种抽象,C 规范只对接口(函数)和行为没有任何关于实现的说明。
  • @Someprogrammerdude,我的问题主要源于看到使用 fileno() 来获取该流的 fd。这让我觉得文件流以某种方式链接到 fd。
  • @Someprogrammerdude:这个问题用 macos 和 C 标记,显然是在询问不属于 C 标准的特性,因此它们不属于 C 标准的事实是美好的。并非每个问题都与标准 C 有关。
  • 该函数是 POSIX 特定函数。参见例如this fileno reference。而在 POSIX 系统上,则 yes 文件描述符将用于实现 C FILE 流。
  • @Someprogrammerdude:最初的问题明确询问了一个不属于 C 标准的特性。

标签: c macos filestream file-descriptor


【解决方案1】:

在 POSIX 系统上,是的,fd 支持 FILE*。关闭 FILE* 关闭 fd。交错使用 fd 和 FILE* 可能会破坏您的数据(FILE* 执行 fd 绕过的用户模式缓冲);您必须禁用缓冲(使用setvbuf 等)或确保FILE* 在任何内容直接写入fd 之前被可靠地刷新。否则,只要没有关闭 fd,FILE* 就应该继续工作。

【讨论】:

    【解决方案2】:

    我的问题主要源于看到使用 fileno() 来获取该流的 fd。这让我觉得文件流以某种方式链接到 fd。

    他们是。

    <stdio.h> 中的函数通常被实现为低级别、特定于操作系统的函数的包装器。这需要一些簿记。标准的FILE 结构需要跟踪“操作系统如何引用流”(即,在 POSIX 系统上,文件描述符),还需要跟踪与流关联的任何缓冲区、这些缓冲区的索引、文件是否需要关闭后被删除(tmpfile()),这些缓冲区是否需要为free()d(因为库分配了它们)与否(因为用户分配了它们并通过setvbuf()将它们与流相关联),多字节编码流的状态,以及自 C11 以来的互斥锁,在操作期间用于锁定流以确保线程安全。

    fileno() 是一个特定于 POSIX 的函数,用于FILE 结构中检索文件描述符,在不了解标准库的情况下对其进行任何访问。导致标准库函数对流的状态有一个不同的想法,而不是操作系统,这可能会让你的程序玩得很开心。

    不要混合使用 POSIX 和标准文件访问,除非您确切知道自己在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2018-09-13
      • 2011-07-20
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2019-05-25
      相关资源
      最近更新 更多