Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 链接计数和ls命令_Linux_File_Ls_Descriptor - Fatal编程技术网

Linux 链接计数和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

我正在学习文件链接计数。只有当链接计数达到0时,才能删除文件的内容。在我的测试中,进程在目录“/home/hel/myfile”中打开一个文件,并休眠10个。同时,我使用“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;
}
#包括
#包括
内部主(空)
{
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”。链接与文件句柄不同;这是对索引节点的单独引用。。。