我真的不确定我应该传递给fdopen
的开放模式,或者为什么它甚至有开放模式。由于fdopen
对文件描述符进行操作,该文件描述符之前可能通过较低级别的调用打开,如open
- 已经设置了模式标志。
我的意思是,我认为fopen
的任何实现只会将char*
模式字符串转换为较低级别模式标志类型,(POS上的OR' d int
系统),然后将其传递给open
。
但是如果我们调用fdopen
我们有一个现有的文件描述符来自之前的open
调用,为什么我们需要标记?它似乎为程序员创建了更多工作,将int
标志转换为char*
的{{1}}标志。
我是否遗漏了一些用例,我们可能希望<{1}}和fdopen
使用不同的标记?
答案 0 :(得分:2)
也许您想将O_RDWR
传递给open(2)
,然后"r"
传递给fdopen(3)
。这是完全合法的事情。也许其他人代表您致电open(2)
和/或fdopen(3)
。
答案 1 :(得分:1)
凯文分享了正确的想法。
FILE *
和fd
受不同实例的约束。由于开放模式很可能是硬编码的,因此程序员输入两次是微不足道的。
确实有些情况下您需要先在fd
中打开一些内容,然后再将其打包到FILE *
。例如,在我尝试在我自己的项目中提供串行端口接口之前,我必须使用open
打开它,以便我可以在其上运行ioctl
,termios
,最后,我用FILE *
包裹它,以便让外部世界使用fgets
或类似的东西。
答案 2 :(得分:0)
引自GNU文档:
文件描述符为输入和输出操作提供原始的低级接口。 [If]您想要执行特定类型设备的控制操作,您必须使用文件描述符;没有设施以这种方式使用流。
文件描述符和流都可以表示与设备(例如终端)的连接,或者用于与其他进程通信的管道或套接字,以及普通文件。
fdopen()函数将流与现有文件描述符fd相关联。流的模式(其中一个值&#34; r&#34;,&#34; r +&#34;,&#34; w&#34;,&#34; w +&#34;, &#34; a&#34;,&#34; a +&#34;)必须与文件描述符的模式兼容。 fopen()函数打开文件,其名称是path指向的字符串,并将流与之关联。
通常,文件描述符不像流那样可移植。
有关详细信息,请访问以下链接:http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html