为什么fdopen有一个"标志"争论?

时间:2014-11-14 17:30:00

标签: c

我真的不确定我应该传递给fdopen的开放模式,或者为什么它甚至有开放模式。由于fdopen对文件描述符进行操作,该文件描述符之前可能通过较低级别的调用打开,如open - 已经设置了模式标志。

我的意思是,我认为fopen的任何实现只会将char*模式字符串转换为较低级别模式标志类型,(POS上的OR' d int系统),然后将其传递给open

但是如果我们调用fdopen我们有一个现有的文件描述符来自之前的open调用,为什么我们需要标记?它似乎为程序员创建了更多工作,将int标志转换为char*的{​​{1}}标志。

我是否遗漏了一些用例,我们可能希望<{1}}和fdopen使用不同的标记?

3 个答案:

答案 0 :(得分:2)

也许您想将O_RDWR传递给open(2),然后"r"传递给fdopen(3)。这是完全合法的事情。也许其他人代表您致电open(2)和/或fdopen(3)

答案 1 :(得分:1)

凯文分享了正确的想法。

FILE *fd受不同实例的约束。由于开放模式很可能是硬编码的,因此程序员输入两次是微不足道的。

确实有些情况下您需要先在fd中打开一些内容,然后再将其打包到FILE *。例如,在我尝试在我自己的项目中提供串行端口接口之前,我必须使用open打开它,以便我可以在其上运行ioctltermios,最后,我用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