链接数和ls命令

我正在学习文件链接计数。 只有链接计数达到0时,才能删除文件的内容。 在我的testing过程中,打开目录“/ home / hel / myfile”中的一个文件,并hibernate10(s)。 同时我使用“rm / home / hel / myfile”删除它。 然后我使用命令“ls”并显示没有这样的文件。 但事实上,该文件仍然存在,因为FD没有closures。 如果是这样,“ls”不能显示文件是否真的存在。 我对“ls”感到困惑。 或者我怎么能判断一个文件真的存在?

#include <fcntl.h> #include <stdlib.h> int main(void) { int fd; fd = open("/home/hel/myfile", O_RDWR); if (fd < 0) { exit(-1); } sleep(10); // sleep 10(s) close(fd); return 0; } 

文件名就像一个指向真实数据的标签。 真实的数据存储在一个inode中 。 一个inode通常只有一个文件名指向它,链接数为1。 但它可以有多个。

这是一个视觉例子。 当你创建一个普通的文件时,它会把你的数据放在一个新的inode中,并指向它的文件名。

 $ echo "foo" > some/file "some/file" -> [data: "foo", links: 1] 

当你制作另一个文件时,同样的事情发生。

 $ echo "bar" > another/file "some/file" -> [data: "foo", links: 1] "another/file" -> [data: "bar", links: 1] 

但是,如果你建立一个硬链接 ,现在inode有两个链接。

 $ ln some/file some/link "some/file" -> [data: "foo", links: 2] ^ "some/link" -----/ "another/file" -> [data: "bar", links: 1] 

事实上,正常的文件是硬链接。 除了文件名之外,没有任何东西可以区分some/file some/link 。 两者都不是“真正”的文件,它们都是链接。

如果链接被删除,链接计数递减。 这就是为什么在某些语言中,您可以调用unlink来删除文件。

 $ rm some/file "some/link" -> [data: "foo", links: 1] "another/file" -> [data: "bar", links: 1] 

当达到0时,inode可以被覆盖。 数据仍然存在,但没有指向它。 这就是为什么你有时可以恢复删除的文件。

 $ rm some/link [data: "foo", links: 0] "another/file" -> [data: "bar", links: 1] 

什么文件句柄? 他们不改变链接数量。 相反,在Unix(而不是Windows)上,操作系统跟踪给定inode有多少打开的句柄。 只要有一个打开的句柄,它将不会允许inode被覆盖。

 fd = open("another/file", O_RDWR); [data: "foo", links: 0] fd ---\ \/ "another/file" -> [data: "bar", links: 1] $ rm another/file [data: "foo", links: 0] fd -> [data: "bar", links: 0] close(fd); [data: "foo", links: 0] [data: "bar", links: 0] 

这可以让你做一些事情,如创建一个临时文件,打开一个句柄来读取和写入,并立即删除它。 程序可以继续读取和写入临时磁盘存储,但是没有人能看到该文件。