【问题标题】:Why does fdopen have a "flags" argument?为什么 fdopen 有一个“标志”参数?
【发布时间】:2014-11-15 02:06:27
【问题描述】:

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

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

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

我是否遗漏了一些我们可能希望openfdopen 使用不同 标志的用例?

【问题讨论】:

    标签: c


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Kevin 分享了正确的想法。

      FILE *fd 由不同的实例管理。由于开放模式很可能是硬编码的,因此程序员只需键入两次即可。

      确实在某些情况下,您需要先在fd 中打开某些内容,然后再将其包装到FILE *。比如在我自己的项目中尝试提供串口接口之前,我必须使用open打开它,这样我就可以在上面操作ioctltermios,最后我用一个FILE * 以便允许外部世界使用 fgets 或类似的东西。

      【讨论】:

        【解决方案3】:

        引用自 GNU 文档:

        文件描述符为输入和输出操作提供了一个原始的低级接口。 [如果]您想要执行特定于特定类型设备的控制操作,则必须使用文件描述符;没有以这种方式使用流的设施。

        文件描述符和流都可以表示与设备(例如终端)的连接,或用于与另一个进程通信的管道或套接字,以及普通文件。

        fdopen() 函数将流与现有文件描述符 fd 相关联。流的模式(值“r”、“r+”、“w”、“w+”、“a”、“a+”之一)必须与文件描述符的模式兼容。 fopen() 函数打开名称为 path 指向的字符串的文件,并将流与它相关联。

        一般来说,文件描述符不像流那样可移植。

        欲了解更多信息,请查看此链接:http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-16
          • 1970-01-01
          • 2012-02-08
          • 2017-11-24
          • 2016-08-22
          相关资源
          最近更新 更多