从已删除的文件中读取

0xh*_*ker 1 c linux filesystems file libc

我在C中写了一个小程序,我成功打开了一个文件,然后叫睡眠20秒.在那20秒我用shell中的rm删除了打开的文件.睡眠后,程序成功读取数据并将其打印在屏幕上.

int bytes_read;
FILE *fp = fopen("/tmp/file", "r");
sleep(20);
bytes_read = fread(buf, 1, 5, fp);
buf[bytes_read] = '\0';
printf("%s", buf);
Run Code Online (Sandbox Code Playgroud)

我希望它读取0个字节,但它会在文件中打印实际数据.这种行为背后的解释是什么?

Jen*_*edt 11

在linux和其他POSIX系统中,您不会删除文件.您只需从目录中删除inode.只要在文件上打开文件描述符,就不会删除它.只有当inode的最后一个链接和最后一个打开的文件描述符消失时.

  • 句子"从目录中删除inode"是无稽之谈.inode不存在于目录中.不同目录中的两个路径可以链接到同一个inode.取消链接与inode的路径(这是`rm`所做的)确实从目录中删除了链接,但是在删除最后一次引用之前,不会从文件系统中删除inode. (2认同)