1、文件系统
1.1、虚拟文件系统
Linux文件系统有两层结构组成。第一层是虚拟文件系统VFS,第二层是各种具体的文件系统。
VFS就是把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分。它位于用户程序和具体的文件系统之间,为用户程序提供了标准的文件系统调用接口。
1.2、通用文件模型
VFS的主要目的在于引入了一个通用的文件模型。模型的核心是4个对象类型:
(1)超级块:存放系统中已安装文件系统的有关信息。对于硬盘的文件系统,这类对象对应存放在磁盘的文件系统控制块,即每个文件系统对应一个超级块。
(2)索引节点:对于具体文件系统,这类对象对应于存放在磁盘的文件控制块。即每个文件对应一个索引节点,每个索引节点有一个索引节点号,这个号用于唯一标识某个文件系统中的一个文件。
(3)目录项:存放目录项与对应文件链接的信息。
(4)文件对象:存放打开文件与进程之间进行交互的有关信息,是进程与文件系统之间的桥梁。
2、文件IO操作
2.1、不带缓存的文件IO操作
文件IO操作中一个重要概念就是文件描述符。对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读写文件时,使用open等函数返回的文件描述符标示该文件,并将其作为参数传递给read或write。
2.1.2、常用文件IO操作函数
(1)open()
(2)close()
(3)read()
(4)write()
(5)lseek()
(6)fcntl()
fcntl函数能够复制一个现有的描述符,获得/设置文件描述符标记,获得/设置文件状态标记,获得/设置异步IO所有权及获得/设置记录锁。
文件锁
文件锁用于在文件共享情况下的操作。Linux通常采用的方法是给文件加锁用来避免对共享资源产生竞争状态。
(7)select()
select函数主要用于处理IO多路复用的情况。
IO处理模型有4种:
1)阻塞IO模型
在这种模型下,若所请求的IO操作无法完成时,会使进程睡眠,直到操作完成才会返回。
2)非阻塞模型
当请求的IO操作不能完成时,不让进程睡眠,而是返回一个错误。通常采用轮询方式处理多路IO,耗费CPU资源。
3)IO多路复用模型
程序把需要处理的多路IO交给内核监控后睡眠。当某个IO就绪时,程序被唤醒后进行相应处理。
4)信号驱动IO模型
程序不需轮询也不需阻塞。当IO就绪时,内核发送SIGIO信号给进程。进程在信号处理函数中完成IO操作。
2.2、标准IO
标准IO又称为高级磁盘IO,是在文件IO的基础上进行封装。提供缓冲区的目的是尽可能减少使用read()和write()调用的次数,提高IO效率。
标准IO提供3种缓冲类型:
(1)全缓冲
当缓冲区满后才进行实际IO操作。
(2)行缓冲
当输入和输出遇到换行符时,进行实际IO操作。
(3)无缓冲
不对输入和输出进行缓冲。
FILE指针
标准IO为每个打开的文件在内存中提供一个区域用于存放文件的相关信息。这些信息被保存在一个由系统定义的结构体类型FILE中。
标准IO操作
(1)打开流
fopen:可以指定打开的文件路径和模式。
fdopen:可以指定打开的文件描述符和模式。
freopen:可以指定打开的文件、模式和特定的IO流。
(2)关闭文件
fclose()
(3)按字符读/写文件
读文件:fgetc/getc/getchar
写文件:fputc/putc/putchar
(4)按行读/写文件
读文件:fgets
写文件:fputs/puts
(5)按指定格式读/写文件
读文件:fread
写文件:fwrite
(6)刷新流
fflush:强制刷新一个流,使该流所有未写的缓冲区数据写入到实际的文件中。
(7)文件定位
fseek/rewind:可以改变流的读/写位置
ftell:返回一个流的当前读/写位置
3、对文件和目录的操作
3.1、文件类型
linux中的文件类型有7种:
(1)目录文件
该类文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任意进程都可以读该目录的内容。
(2)普通文件
该类文件包含了某种数据。至于数据是文本还是二进制,对于内核而言无区别。
(3)字符设备文件
用于系统中的字符设备。
(4)块设备文件
通常用于磁盘设备。
(5)FIFO
这种文件用于进程间通信,也称为命名管道,或有名管道。
(6)套接字
这种文件主要用于不同主机进程之间的网络通信。
(7)符号链接
这种文件指向另一个文件。类似于Windows中的快捷方式。
3.2、文件访问权限
3.3、文件和目录的操作
(1)获取文件属性
stat:通过文件名获取属性
fstat:通过文件描述符获取属性
lstat:提供文件名获取属性,支持符号链接。
(2)修改文件访问权限
chmod:通过文件名修改属性
fchmod:通过文件描述符修改属性
(3)创建目录
mkdir
(4)创建链接文件
link:创建硬链接
symlink:创建符号链接
(5)删除文件
unlink:删除文件
remove:删除文件
(6)重命名文件
rename