我使用fopen将文件流打开到一个非常大的文件.在对该流执行任何读取操作之前,我使用unlink()删除了该文件.而且,我能够阅读整个文件.
我猜测有一个与流关联的缓冲区,它保存文件的数据.但显然缓冲区有限制.这就是我选择大小为551126688字节或526MB的a_big_file的原因.
我想知道它背后的确切原因是什么.这是我使用的测试代码.
#include#include 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; }
输出:file_size是551126688
In Unix and Unix-like operating systems, the file doesn't actually go away until the last open file handle on it is closed. This is a very useful trick for temporary files - if you unlink it as soon as you open it, the file won't be visible to other processes, and it will be removed from the system as soon as your program closes it, ends or crashes. That helps prevent the proliferation of orphan temp files.
实际上(在这里掩饰一些技术细节)会发生什么是Unix文件系统被引用计数.当您打开文件时,实际上您已连接到文件的inode(这是文件实际内容所在位置的真实指示).但取消链接文件只会删除目录条目,因此该文件不再具有名称.文件系统只会回收文件空间(即inode),如果它不在任何目录条目中,并且没有人打开它.其他进程无法以普通方式打开它,因为它们无法将文件名映射到inode.
请注意,Unix文件系统允许多个目录条目指向同一个inode - 我们称之为"硬链接".如果你执行"ls -l",其中一个字段是指向同一个inode的硬链接数,如果你执行"ls -li",则可以看到实际的inode地址.
从取消链接的手册页:
unlink()从文件系统中删除一个名称.如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且其使用的空间可供重用.
如果名称是文件的最后一个链接,但任何进程仍然打开文件,则文件将保持存在,直到引用它的最后一个文件描述符关闭为止.
粗体位解释了这种行为.:-)
[编辑] BTW你应该在return语句之前用fclose()关闭文件... [/ edit]