一起养成写作习惯!这是我参与「掘金日新计划 · 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上被调用的文件程序,例如mkdir
、ln
和rm
。这个设计允许任何人都可以添加命令行接口通过添加新的用户层程序。这种设计看起来是平常的,但是当时其他的系统往往将这样的命令内置到shell中,甚至可能将shell内置到内核中。
一个例外就是cd
指令,这是被内置到shell中的。cd
必须切换shell当前的工作目录,如果cd
作为一个常规命令被运行,shell就会fork出一个子进程,子进程将会运行cd
指令,所以cd
会切换子进程的工作目录,而它的父进程也就是shell的工作目录并没有被切换。
文件系统的下半部分,和我们平常用的linux息息相关。
一个小问题:当inode被清理时,它的数据真的消失了吗?
感谢阅读。