如何从文件描述符获取文件指针?

97

我正在尝试使用mkstemp(),该函数返回文件描述符,但我想通过fprintf()生成格式化输出。是否有一种简单的方法将mkstemp()提供的文件描述符转换为适用于fprintf()FILE *结构?


6
反过来: 如何将文件指针(FILE *)转换为文件描述符(fd)? - Michael Burr
3个回答

121
使用fdopen()函数:
FILE* fp = fdopen(fd, "w");

37
要从 FILE* 获取文件描述符,请使用fileno()函数:http://linux.die.net/man/3/fileno - Lee Netherton
3
如果以某些标志(如O_NONBLOCK)打开了fd,那么在使用fdopen打开它并设置新标志后,原来的标志会发生什么?它们会被异或在一起还是被替换? - xealits
5
@jww:首先,文件描述符并不是ANSI C的一部分。 - Rufflewind
2
在某个被反复调用的函数内部多次调用fdopen会有什么不好的影响吗? - phil294
2
@xealits FILE的选项必须在已打开的文件描述符的范围内。因此,如果您使用只读方式打开了fd,并使用写入方式打开了FILE,则应该抛出异常。有关更多信息,请参阅https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/rtfdo.htm - Tjad Clark
显示剩余6条评论

32

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

man fdopen 输出:

概要

#include <stdio.h>

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

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


1
不支持 ANSI C。 - jww
要了解更多信息,请参考https://www.ibm.com/support/knowledgecenter/zh/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/rtfdo.htm。 - Tjad Clark

-8

没有标准的方法来实现这个(或反过来)因为C标准对文件描述符没有任何规定。你所使用的特定平台可能会提供这样的机制,也可能不会。


18
取决于你所指的“标准”是什么。POSIX是一种标准。 - Richard Pennington
12
这个问题涉及到文件描述符。;-) - Richard Pennington
11
被标记为 C 的问题并不意味着“告诉我有关 C 标准的真相”,而是“我正在使用 C 编程,在做这件事情时失败了,请告诉我是否可能以及如何解决?”请注意,翻译过程中不会包含解释或其他非翻译内容。 - Gregory Pakosz
8
同意没有标准的做法,但是原帖提到 mkstemp 暗示着在这种情况下接受非标准解决方案。然而,在这种情况下,他应该添加 posix 标签(我看到已经添加了)。 - Emerick Rogul
9
@Neil,网络的目的和生命的意义。如果你说你持不同意见,那会更有意义。我也怀疑SO是否只是在标准上吹毛求疵。而且仅依靠一个声望为23的SO用户的标记技能也不是很实用。 - Michael Krelin - hacker
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接