gpt4 book ai didi

c - 删除文件后可以使用 fread 吗?

转载 作者:行者123 更新时间:2023-12-02 05:21:48 24 4
gpt4 key购买 nike

我使用 fopen 将文件流打开到一个非常大的文件。
在对该流执行任何读取操作之前,我使用 unlink() 删除了该文件。
而且,我仍然能够阅读整个文件。

我猜测有一个与流相关联的缓冲区,它保存文件的数据。但显然该缓冲区将有一个限制。这就是我选择大小为 551126688 字节或 526MB 的 a_big_file 的原因。

我想知道它背后的确切原因是什么。
这是我使用的测试代码。

#include <stdio.h>
#include <unistd.h>

int main(){

FILE *fp;
long long int file_size = 0;
int bytes_read = 0;
char buf[1];

fp = fopen("a_big_file", "r");

unlink("a_big_file");

while(0 != (bytes_read = fread(buf, 1, 1, fp))){
file_size += bytes_read;
}

printf("file_size is %llu\n", file_size);

return 0;
}

输出:
文件大小为 551126688

最佳答案

在 Unix 和类 Unix 操作系统中,文件实际上直到最后打开的文件句柄关闭后才消失。这对于临时文件来说是一个非常有用的技巧——如果你一打开它就取消链接,其他进程就看不到该文件,并且一旦你的程序关闭它,它就会从系统中删除,结束或崩溃。这有助于防止孤立临时文件的扩散。

实际上(这里忽略了一些技术细节)发生的是 Unix 文件系统是引用计数的。当您打开文件时,您实际上会连接到文件的 inode(这是文件实际内容所在位置的真正指示)。但是取消链接文件只会删除目录条目,因此文件不再有名称。如果文件空间(即 inode)不在任何目录条目中,并且没有人打开它,文件系统只会回收文件空间(即 inode)。其他进程无法以普通方式打开它,因为它们无法将文件名映射到 inode。

请注意,Unix 文件系统允许多个目录条目指向同一个 inode——我们称之为“硬链接(hard link)”。如果执行“ls -l”,其中一个字段是指向同一 inode 的硬链接(hard link)的计数,如果执行“ls -li”,则可以看到实际的 inode 地址。

关于c - 删除文件后可以使用 fread 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/507109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com