微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如果 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);
  }
}

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

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

解决方法

List<Integer> list = Arrays.asList(2,4,6,8,10); System.out.println("forEach"); list.stream().parallel().forEach( System.out::println ); System.out.println(); System.out.println("forEachOrdered"); list.stream().parallel().forEachOrdered( System.out::println ); 也没有在我的系统上提供答案,但是 forEach 6 10 8 4 2 forEachOrdered 2 4 6 8 10 揭示了 official version from the POSIX Programmer's manual,它在这个问题上更加全面:

man fclose 函数应对与流指向的流相关联的文件描述符执行等效的 man 3p fclose

,

答案是NO,C 标准对此含糊不清(重点是我的):

7.21.5.1 fclose 函数

概要

#include <stdio.h>
int fclose(FILE *stream);
 

说明
成功调用 fclose 函数会导致 stream 指向的流被刷新并关闭关联的文件。流的任何未写入的缓冲数据都将传递到主机环境以写入文件;任何未读的缓冲数据都将被丢弃。 无论调用是否成功,流都会与文件解除关联,并且 setbufsetvbuf 函数设置的任何缓冲区都与流解除关联(如果它是自动分配的,则解除分配)。

退货
如果流成功关闭,则 fclose 函数返回零,如果检测到任何错误,则返回 EOF

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。