xv6-一个精巧操作系统(7)

93 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情



原文链接 xv6-riscv文档


1.4 文件系统

fstat系统调用会返回文件描述符指向的inode的信息,写入在stat.h中被定义的结构体struct stat中,如下所示:

#define T_DIR 1 // Directory
#define T_FILE 2 // File
#define T_DEVICE 3 // Device
struct stat {
    int dev; // File system’s disk device
    uint ino; // Inode number
    short type; // Type of file
    short nlink; // Number of links to file
    uint64 size; // Size of file in bytes
};

link系统调用创建另一个作为已存在的、指向相同inode的文件名。以下的代码创建了一个又叫a又叫b的文件:

open("a", O_CREATE|O_WRONLY);
link("a", "b");

写入或读取a文件和写入或读取b文件是一样的。文件的inode和持有其内容的磁盘空间只有当文件链接数为0时已经没有文件描述符指向它时才释放。因为添加unlink("a");作为上面代码的最后一行会使得该文件只能通过b获取。此外:

fd = open("/tmp/xyz", O_CREATE|O_RDWR);
unlink("/tmp/xyz");

是一种常见的创建一个临时的没有名字的inode的方式,当进程关闭fd描述符或者进程退出时,该inode就会被清理。

Unix提供了可以作为用户程序在shell上被调用的文件程序,例如mkdirlnrm。这个设计允许任何人都可以添加命令行接口通过添加新的用户层程序。这种设计看起来是平常的,但是当时其他的系统往往将这样的命令内置到shell中,甚至可能将shell内置到内核中。

一个例外就是cd指令,这是被内置到shell中的。cd必须切换shell当前的工作目录,如果cd作为一个常规命令被运行,shell就会fork出一个子进程,子进程将会运行cd指令,所以cd会切换子进程的工作目录,而它的父进程也就是shell的工作目录并没有被切换。


文件系统的下半部分,和我们平常用的linux息息相关。

一个小问题:当inode被清理时,它的数据真的消失了吗?

感谢阅读。