如何解决如果 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)
可能会因各种原因而失败 - 是否可以保证/何时关闭底层文件描述符或之后它仍然打开?
解决方法
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
指向的流被刷新并关闭关联的文件。流的任何未写入的缓冲数据都将传递到主机环境以写入文件;任何未读的缓冲数据都将被丢弃。 无论调用是否成功,流都会与文件解除关联,并且 setbuf
或 setvbuf
函数设置的任何缓冲区都与流解除关联(如果它是自动分配的,则解除分配)。
退货
如果流成功关闭,则 fclose
函数返回零,如果检测到任何错误,则返回 EOF
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。