【发布时间】:2020-05-10 06:34:12
【问题描述】:
我们什么时候应该使用 fdopen 以及如何使用它?我对此的理解是当我们不能使用 fopen 来读取(从管道读取)时。我不太明白手册页上 fdopen 的描述:The fdopen() function associates a stream with the existing file descriptor, fd。
【问题讨论】:
我们什么时候应该使用 fdopen 以及如何使用它?我对此的理解是当我们不能使用 fopen 来读取(从管道读取)时。我不太明白手册页上 fdopen 的描述:The fdopen() function associates a stream with the existing file descriptor, fd。
【问题讨论】:
当您有某种文件描述符 (int fd;) 但您需要调用需要文件流 (FILE *fp;) 的函数时,您可以使用 fdopen()。这可以是管道文件描述符、套接字文件描述符或任何其他文件描述符类型。
一旦你使用了fdopen(),你不应该再次使用文件描述符——你应该只使用文件流。如果还必须使用文件描述符,最好使用fileno(fp) 而不是保存的fd。最重要的是,如果您混合访问,则需要确保在对文件描述符执行任何操作之前已刷新文件流。 (文件描述符没有缓冲,因此从文件描述符恢复到文件流的问题较少。)。更改文件描述符上当前文件位置的操作可能会弄乱文件流,反之亦然(当存在与文件描述符或文件流关联的当前位置时)。请注意,读取和写入操作都会更改当前文件位置 - 您可以做很多事情而不会冒着混乱的风险。
您必须使用fclose(fp); 来关闭文件流(并隐式地关闭文件描述符)。不要只使用close(fd) 或close(fileno(fp))。
请注意,POSIX 定义 dprintf() 以对文件描述符进行格式化输出。此外,您可以使用snprintf() 或其亲属将数据格式化为字符串,然后将字符串写入文件描述符。这可能会降低使用fdopen() 的重要性。
【讨论】: