如果 fclose() 失败,文件描述符是否仍然打开?

the*_*nny 9 c posix fclose

想象以下代码作为线程运行:

void *thread_worker(void *q) {
 for (;;) {
  int fd = some_queue_get(q);
  FILE *writer = fdopen(fd, "w");
  if (!writer) { perror("fdopen"; close(fd); continue; }
  // do something with writer

  if (fclose(writer) == EOF) {
   perror("fclose writer");
   // should fd be closed here?
   close(fd);
  }
}
Run Code Online (Sandbox Code Playgroud)

fclose(3) 可能因各种原因而失败 - 是否有保证/何时关闭底层文件描述符或之后它仍然打开?

  • 如果在冲洗失败时 fd 没有被 fclose 关闭,一个人会在没有额外关闭的情况下泄漏 fds。
  • 如果 fd 被 fclose 关闭,则额外的关闭可能会关闭由其他线程新打开的文件描述符。

Tho*_*mas 2

man fclose也没有在我的系统上提供答案,但man 3p fclose揭示了POSIX 程序员手册 的官方版本,该版本在这个问题上更加全面:

该函数应在与流指向的流关联的文件描述符上fclose()执行相当于 a 的操作。close()

  • 但是 [`close()` 可能会失败](/sf/ask/2317990671/) 并且你对此无能为力比记录它。特别是,您***不能***安全地重试“close()”调用。 (4认同)