【发布时间】:2021-05-08 21:49:14
【问题描述】:
想象以下代码作为线程运行:
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 关闭,则会在没有额外关闭的情况下泄漏 fd。
- 如果 fd 被 fclose 关闭,额外的关闭可能会关闭另一个线程新打开的文件描述符。
【问题讨论】:
-
来自文档:如果 fclose 失败,对流的任何进一步访问(包括对 fclose 的另一个调用)都会导致未定义的行为。
-
@Jabberwocky 我不想访问流,但是文件描述符
-
鉴于您的函数名称 -
thread_worker,close(fd)是危险的。如果fclose()确实关闭了它的文件描述符但无论如何都失败了,那么另一个线程可以重用该值,并且您可以直接从另一个线程下将其关闭。 -
@AndrewHenle 正如 thejonny 在最后一句话中所写...
-
@Thomas 而且真的没有办法检查这种情况。