【问题标题】:POSIX fdopen() function in CC中的POSIX fdopen()函数
【发布时间】:2020-05-10 06:34:12
【问题描述】:

我们什么时候应该使用 fdopen 以及如何使用它?我对此的理解是当我们不能使用 fopen 来读取(从管道读取)时。我不太明白手册页上 fdopen 的描述:The fdopen() function associates a stream with the existing file descriptor, fd

【问题讨论】:

    标签: c linux posix


    【解决方案1】:

    当您有某种文件描述符 (int fd;) 但您需要调用需要文件流 (FILE *fp;) 的函数时,您可以使用 fdopen()。这可以是管​​道文件描述符、套接字文件描述符或任何其他文件描述符类型。

    一旦你使用了fdopen(),你不应该再次使用文件描述符——你应该只使用文件流。如果还必须使用文件描述符,最好使用fileno(fp) 而不是保存的fd。最重要的是,如果您混合访问,则需要确保在对文件描述符执行任何操作之前已刷新文件流。 (文件描述符没有缓冲,因此从文件描述符恢复到文件流的问题较少。)。更改文件描述符上当前文件位置的操作可能会弄乱文件流,反之亦然(当存在与文件描述符或文件流关联的当前位置时)。请注意,读取和写入操作都会更改当前文件位置 - 您可以做很多事情而不会冒着混乱的风险。

    您必须使用fclose(fp); 来关闭文件流(并隐式地关闭文件描述符)。不要只使用close(fd)close(fileno(fp))

    请注意,POSIX 定义 dprintf() 以对文件描述符进行格式化输出。此外,您可以使用snprintf() 或其亲属将数据格式化为字符串,然后将字符串写入文件描述符。这可能会降低使用fdopen() 的重要性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2017-05-05
      • 2014-06-22
      • 2011-12-15
      相关资源
      最近更新 更多