第七、八章学习笔记
第七章 文件操作
文件操作级别
文件操作分为五个级别,按照从高到低的顺序如下:
(1)硬件级别:硬件级别的文件操作包括:
-
fdisk:将硬盘、U盘或SDC盘分区。
-
mkfs:格式化磁盘分区、为系统做好准备。
-
fsck:检查和维修系统。
-
碎片整理:压缩文件系统中的文件。
大多数是针对系统的实用程序。普通用户永远可能都不需要它们,但是它们是创建和维护系统不可或缺的工具。
(2)操作系统内核中的文件系统函数:每个操作系统内核均可为基本文件操作提供支持。
(3)系统调用:用户模式程序使用系统调用来访问内核函数。
(4)I/O库函数:系统调用何以让用户读/写多个数据块,这些数据块只是一系列字节。
为方便用户使用,C语言提供了一些列标准的I/O函数,同时提高了运行效率。除了读/写内存位置的sscanf()/sprintf()函数之外,所有其他I/O库函数都建立在系统调用之上,也就是说,他们最终会通过系统内核发出实际数据传输的系统调用。
(5)用户命令:用户可以使用Linux/Unix命令来执行文件操作。
(6)sh脚本:虽然比系统调用方便得多,但是必须要手动输入命令,如果使用的是GUI,必须拖放文件图标和点击指向设备来输入,操作烦琐且耗时。
文件I/O操作
分区
一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,称为分区。各分区均可以格式化为特定的文件系统,也可以安装在不同的操作系统上。分区表位于第一个扇区的字节偏移446(0x1BE)处,该扇区称为设备的主引导记录(MBR)
扩展类型分区(类型编号=5),每个扩展类型分区的第一个扇区是一个*地MBR。每个本地MBR在字节偏移量0x1BE处也有一个分区表,只包含两个条目。
-
第一个条目定义了扩展分区的起始扇区和大小;
-
第二个条目定义指向下一个本地MBR。所有本地MBR的扇区编号都与P4的起始扇区有关。
格式化分区
fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。存储文件必须先为特定的文件系统准备好分区。称为格式化磁盘或磁盘分区。
EXT2文件系统
多年来,Linux一直使用EXT2作为默认文件系统。EXT3中增加的主要内容是一个日志文件,记录系统更改记录。日志可在文件系统崩溃时更快从错误中恢复。
-
Block#0: 引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。
-
Block#1: 超级块(在硬盘分区中字节偏移量为1024)。用于容纳关于整个文件系统的信息。 超级块中一些重要字段。
第八章 使用系统调用进行文件操作
操作系统中,进程以两种不同模式运行:
-
内核模式(Kmode):执行特殊权限操作;
-
用户模式(Umode):权限非常有限,不可执行任何需要特殊权限的操作;
系统调用(syscall)一种允许进程进入Kmode执行Umode不允许操作的机制。
man2子目录列出了所有系统调用手册页。手册页的SYNOPSIS(摘要)部分列出了系统调用所需的头文件。
系统调用必须由程序发出。
链接文件
在Unix/Linux中,每个文件都有一个路径名。但是,Unix/Linux允许使用不同的路径名来表示同一个文件。这些文件叫作LINK (链接)文件。有两种类型的链接,即硬链接和软链接或符号链接。
stat与文件索引节点
stat与文件索引节点:
stat的工作原理:每个文件都有一个独有的索引节点数据结构,包含文件的所有信息。每对设备由主、次设备号标识,stat系统调用只是查找文件的索引节点并将信息从索引节点复制到stat结构体中。(st_dev和st_ino除外,他们分别是设备号和索引节点编号)
open-close-lseek 系统调用
- open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode); - close:关闭打开的文件描述符
int close(int fd); - read:读取打开的文件描述符
int read (int fd, char buf[ ], int count); - write:写入打开的文件描述符
int write(int fdr char buf[ ], int count); - lseek:将文件描述符的字节偏移量重新定位为偏移量
int lseek(int fd, int offset, int whence); - umask:设置文件创建掩码;文件权限为(mask &〜umask)