Imagine the following code running as a thread:
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)
can fail for various reasons - is there a guarantee that/when the underlying file descriptor is closed or that it is still open afterwards?
- if fd is not closed by fclose on a flushing failure, one leaks fds without an additional close.
- if fd is closed by fclose, an additional close might close a file descriptor that was newly opened by an other thread.