0%

《趣谈linux操作系统》小结(二十二) - 文件系统

文件系统

对于运行的进程来说,内存就像一个纸箱子,仅仅是一个暂存数据的地方,而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在外部存储中,比如磁盘,数据是以文件的形式保存在硬盘上的。文件系统就是对文件进行管理的模块。

文件系统功能

  • 文件固定格式
  • 文件的索引
  • 常用文件缓存
  • 文件应该用文件夹的形式组织起来,方便管理和查询

在文件系统中,每个文件都有一个名字,这样我们访问一个文件,希望通过它的名字就可以找到。文件名就是一个普通的文本。当然文件名会经常冲突,不同用户取相同的名字的情况还是会经常出现的。文件的树形结构如下:

图片替换文本
  • 要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用。

文件系统相关命令行

使用fdisk命令对磁盘进行格式化、分区等操作。

使用mount命令将分区挂在到指定的目录下。

1
mount /dev/vdc1 /根目录/用户A目录/目录1

umount命令卸载

1
umount /根目录/用户A目录/目录1

ls -l命令查看文件类型, 通过第一个字节判断文件的类型

1
2
3
4
5
6
7
Keep:raw_blog keep$ ls -l
total 376
-rw-r--r-- 1 keep staff 4722 Jun 4 2020 1.patch
-rw-r--r--@ 1 keep staff 425 Jun 3 2020 README.md
-rw-r--r-- 1 keep staff 2389 Dec 23 15:52 _config.yml
-rw-r--r-- 1 keep staff 174 Feb 4 16:35 db.json
drwxr-xr-x 325 keep staff 10400 Jun 8 2020 node_modules

- 表示普通文件;d 表示文件夹;c 表示字符设备文件;b 表示块设备文件;s 表示套接字 socket 文件;l 表示符号链接,也即软链接,就是通过名字指向另外一个文件

文件系统相关系统调用

open 打开文件, 操作系统会创建一些数据结构来表示这个被打开的文件。为了能够找到这些数据结构,在进程中,我们会为这个打开的文件分配一个文件描述符 fd(File Descriptor)。文件描述符,就是用来区分一个进程打开的多个文件的。它的作用域就是当前进程,出了当前进程这个文件描述符就没有意义了。open 返回的 fd 必须记录好,我们对这个文件的所有操作都要靠这个 fd,包括最后关闭文件。

在 Open 函数中,有一些参数:

  • O_CREAT 表示当文件不存在,创建一个新文件;
  • O_RDWR 表示以读写方式打开;
  • O_TRUNC 表示打开文件后,将文件的长度截断为 0。

write写入数据,第一个参数就是文件描述符,第二个参数表示要写入的数据存放位置,第三个参数表示希望写入的字节数,返回值表示成功写入到文件的字节数。

lseek 用于重新定位读写的位置,第一个参数是文件描述符,第二个参数是重新定位的位置,第三个参数是 SEEK_SET,表示起始位置为文件头,第二个参数和第三个参数合起来表示将读写位置设置为从文件头开始 0 的位置,也即从头开始读写。

read 用于读取数据,第一个参数是文件描述符,第二个参数是读取来的数据存到指向的空间,第三个参数是希望读取的字节数,返回值表示成功读取的字节数。

最终,close 将关闭一个文件。

文件信息的获取,可以通过下面几个函数

1
2
3
int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);

函数 stat 和 lstat 返回的是通过文件名查到的状态信息。这两个方法区别在于,stat 没有处理符号链接(软链接)的能力。如果一个文件是符号链接,stat 会直接返回它所指向的文件的属性,而 lstat 返回的就是这个符号链接的内容,fstat 则是通过文件描述符获取文件对应的属性。

文件系统概要:

图片替换文本

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。