Linux 链接计数和ls命令
我正在学习文件链接计数。只有当链接计数达到0时,才能删除文件的内容。在我的测试中,进程在目录“/home/hel/myfile”中打开一个文件,并休眠10个。同时,我使用“rm/home/hel/myfile”删除它。然后我使用命令“ls”并且不显示这样的文件。但事实上,该文件仍然存在,因为fd尚未关闭。如果是,则“ls”不能显示文件是否确实存在。我对“ls”感到困惑。或者我如何判断文件是否真的存在Linux 链接计数和ls命令,linux,file,ls,descriptor,Linux,File,Ls,Descriptor,我正在学习文件链接计数。只有当链接计数达到0时,才能删除文件的内容。在我的测试中,进程在目录“/home/hel/myfile”中打开一个文件,并休眠10个。同时,我使用“rm/home/hel/myfile”删除它。然后我使用命令“ls”并且不显示这样的文件。但事实上,该文件仍然存在,因为fd尚未关闭。如果是,则“ls”不能显示文件是否确实存在。我对“ls”感到困惑。或者我如何判断文件是否真的存在 #include <fcntl.h> #include <stdlib.h&g
#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;
}
#包括
#包括
内部主(空)
{
int-fd;
fd=打开(“/home/hel/myfile”,O_RDWR);
如果(fd<0){
出口(-1);
}
睡眠(10);//睡眠10(s)
关闭(fd);
返回0;
}
文件名就像指向真实数据的标签。真实数据存储在一个数据库中。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
。两者都不是“真实”文件,它们都是链接
如果删除链接,则链接计数将减少。这就是为什么在某些语言中,您会调用来删除文件
$ 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]
这使您可以创建一个临时文件,打开一个读写句柄,然后立即删除它。然后,程序可以继续读写临时磁盘存储,但没有人能看到该文件。您不知道链接是什么,而不是“ls”。链接与文件句柄不同;这是对索引节点的单独引用。。。