提问人:famedoro 提问时间:1/21/2022 最后编辑:famedoro 更新时间:1/21/2022 访问量:830
在 C 中关闭文件
Close file in C
问:
在 Linux 下,我使用此代码重定向文件上的 stdout 和 stderr,如代码所示,该文件使用 fopen(f) 打开并使用 close(fd) 关闭。
int fd;
FILE *f;
f = fopen("test.txt", "rb+");
fd = fileno(f);
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO);
close(fd);
我的问题是 close(fd) 语句是否关闭所有文件描述符,或者是否也有必要使用 fclose(f) ?
答:
C FILE* 流在内部使用缓冲 I/O。fclose() 刷新此缓冲区,然后在操作系统级别关闭文件描述符。close() 的 FILE* 流可能不会刷新此内部缓冲区,并且可能会丢失数据。因此,对于 C 流,请始终使用 C fxxx() 函数。
规则是关闭最外层。在这里,指向的 FILE 对象包含文件句柄,但也包含内部数据,例如可能的缓冲区和指向它的各种指针。f
fd
使用 时,释放了与文件相关的内核结构,但标准库提供的所有数据结构都不会释放。另一方面,将在内部关闭文件句柄,但它也会释放 分配的所有资源。close(fd)
fclose(f)
fd
fopen
TL/DR:如果你用打开一个文件,你应该用它来关闭它,但如果你用 ,那么你应该用 .fd= open(...);
close(fd);
f = fopen(...);
fclose(f);
评论
fileno
正如在其他答案中已经指出的那样,您应该使用 而不是 .fclose(f);
close(fd);
我的问题是 close(fd) 语句是否关闭所有文件描述符 [...]
不,它不会关闭所有文件描述符。文件描述符,并且仍将保持打开状态,现在将引用打开的文件。但是,这些文件描述符可能不应该被关闭,因为它是良好的编程实践,并且在程序结束之前保持有效。它们将在进程终止时由内核自动关闭。STDOUT_FILENO
STDERR_FILENO
test.txt
STDOUT_FILENO
STDERR_FILENO
评论