如何将文件指针(FILE * fp)转换为文件描述符(int fd)?


Answers:


214

适当的功能是int fileno(FILE *stream)。可以在中找到,它<stdio.h>是POSIX标准,但不是标准C。


4
严格来说,如果函数确实是标准C库的一部分,则无需提及任何标头或库。但是,它不是标准的,这就是为什么至少提到标头可能有意义的原因。
AnT 2010年

20
访问标准C库中的函数确实需要包括标头,至少在编译器需要原型的情况下(我从不记得这方面的实际标准行为)。如果没有标题,则在C文件的开头没有定义名称。
Phil Miller'7

1
@Novelocrat:我并不是说不需要#include任何东西。我只是说,为标准函数找到适当的头文件名称总是很容易的。也就是说,在答案中提及确切的标题名称并不是很关键。
2010年

9
这是一个很好的答案,但值得注意的是,这不是标准的c函数,它是posix函数。
Evan Teran 2010年

6
它不是C标准的,因为文件描述符是UNIX(在Linux上是open(2),而不是open(3))。
非用户

42

即使fileno(FILE *)可能返回文件描述符,也要非常小心,不要绕过stdio的缓冲区。如果有缓冲区数据(读或未写写入),则从文件描述符进行读/写操作可能会给您带来意想不到的结果。

要回答附带问题之一,将文件描述符转换为FILE指针,请使用 fdopen(3)


1
我认为这对专门搜索此内容的人没有帮助,并且在撰写本文之前一个月,这已经在OP帖子的评论部分得到了解答。与真实信息相反,这更多是逻辑上的澄清。
kevr

4
需要提出重要意见的人作为答案。很大一部分评论都是像您这样的
刻薄
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.