想象以下代码作为一个线程运行:
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
关闭,则另一个线程新打开的文件描述符可能会被额外关闭。
thread_worker
,close(fd)
是危险的。如果fclose()
已经关闭了它的文件描述符,但无论如何失败了,另一个线程可能会重复使用该值,而您将从另一个线程中关闭它。 - Andrew Henlefclose
,也不能尝试关闭底层FD。幸运的是,你不太可能使用这样的操作系统。例如,“Linux内核总是在关闭操作中尽早释放文件描述符,使其可以重新使用;可能返回错误的步骤(例如将数据刷新到文件系统或设备)仅发生在关闭操作的后期。”(来自man close) - rici