【问题标题】:How to get a FILE pointer from a file descriptor?如何从文件描述符中获取 FILE 指针?
【发布时间】:2010-12-28 19:51:14
【问题描述】:

我在玩mkstemp(),它提供了一个文件描述符,但我想通过fprintf() 生成格式化输出。有没有一种简单的方法可以将mkstemp() 提供的文件描述符转换为适合与fprintf() 一起使用的FILE * 结构?

【问题讨论】:

标签: c posix mkstemp


【解决方案1】:

使用fdopen():

FILE* fp = fdopen(fd, "w");

【讨论】:

  • 要从 FILE* 中获取文件描述符,请使用 fileno() : linux.die.net/man/3/fileno
  • 如果fd 是用一些标志打开的(比如O_NONBLOCK) - 在fdopen 用新标志打开它之后会发生什么?他们会被xor-ed 在一起还是被替换?
  • @jww:文件描述符一开始就不是 ANSI C。
  • 多次调用fdopen 有什么不好吗? (假设它发生在某个被一次又一次调用的函数中)
  • @xealits FILE* 的选项必须在已打开的文件描述符的范围内。因此,如果您以只读方式打开 fd,而以只写方式打开 FILE*,它应该会引发异常。更多信息请参考ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
【解决方案2】:

FILE* f = fdopen(d, "w");

man fdopen 输出:

概要

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

fdopen() 函数将流与现有文件描述符 fildes 相关联。流的模式必须与文件描述符的模式兼容。当流通过fclose(3) 关闭时,fildes 也将关闭。

【讨论】:

【解决方案3】:

没有标准的方法来做到这一点(或相反),因为 C 标准对文件描述符没有任何规定。您的特定平台可能会也可能不会提供这种机制。

【讨论】:

  • 取决于您所说的“标准”。 POSIX 是一种标准。
  • 问题是关于文件描述符的。 ;-)
  • @Neil > 被标记为 C 的问题并不意味着“告诉我关于 C 标准的真实真相”,而是“我正在用 C 编码,我做不到这一点,请告诉我我是否有可能以及如何?”
  • 我同意没有标准的方法可以做到这一点,但 OP 提到 mkstemp 意味着在这种特定情况下非标准解决方案是可以接受的。然而,在这种情况下,他应该添加posix 标签(我看到已经添加了)。
  • @Neil,以及网络的目的和生活的意义。如果你说你有不同的意见,你会更有意义。我也怀疑 SO 是否完全是关于标准的分歧。并且依靠具有与 23 的声誉相对应的 SO 经验的人的标记技能并不是很实际。
猜你喜欢
  • 2010-12-03
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2010-12-08
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多