gpt4 book ai didi

linux - 链接计数和 ls 命令

转载 作者:太空狗 更新时间:2023-10-29 12:13:12 27 4
gpt4 key购买 nike

我正在学习文件链接数。只有当链接数达到 0 时,文件的内容才会被删除。在我的测试中,该进程在目录“/home/hel/myfile”中打开一个文件并休眠 10(s)。同时我使用“rm/home/hel/myfile”删除它。然后我使用命令“ls”并显示没有这样的文件。但实际上文件还存在,因为fd还没有关闭。如果是这样,“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;
}

最佳答案

文件名就像一个指向真实数据的标签。真实数据存储在an 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]

但是如果你做一个hard link , 现在 inode 有两个链接。

$ ln some/file some/link

"some/file" -> [data: "foo", links: 2]
^
"some/link" -----/

"another/file" -> [data: "bar", links: 1]

其实普通文件都是硬链接(hard link)。除了文件名,没有什么可以区分 some/filesome/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]

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

关于linux - 链接计数和 ls 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34407685/

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