20211314王艺达学习笔记4

发布时间 2023-09-29 17:27:07作者: 20211314王艺达

学习总结

第七章 文件操作

文件操作级别

(1)硬件级别

fdisk:将硬盘、U盘或SDC盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检 查和维修系统
碎片整理:压缩文件系统中的文件

(2)操作系统内核中的文件系统函数

前缀为k表示内核函数

(3)系统调用

open()、read()、lseek()、close()
open()、read()、lseek()和 close()函数都是C语言库函数。每个库函数都会发出一个系统调用,使进程进入内核模式来执行相应的内核函数,例如open可进入kopen(),read可进入kread()函数,等等。当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果。在用户模式和内核模式之间切换需要大量的操作(和时间)。因此,内核和用户空间之间的数据传输成本昂贵。对于读/写文件,最好的方法是匹配内核的功能。内核会按数据块大小(从1KB到8KB)来读取/写入文件。(在Linux 中,硬盘的默认数据块大小是4KB,软盘的是1KB)

(4)I/O库函数

用户通常需要读/写单独的字符、行或数据结构记录等。如果只有系统调用,用户模式程序则必须自己从缓冲区执行这些操作。C语言库提供了一系列标准的I/O函数,同时也提高了运行效率。I/O库函数包括:
FILE:fopen()、fread();fwrite()、fseek()、fclose()、fflush()
char:getc()、getchar()、ugetc()、putc()、putchar()
line:gets()、fgets()、puts()、fputs()
formatted:scanf()、fscanf()、sscanf()、printf()、fprintf()、sprintf()

(5)用户命令

用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。
mkdir,rmdir,cd,pwd,ls,link,unlink,rm,cat,cp,mv,chmod,etc.

(6)sh脚本

sh语言包含所有的有效Unix/Linux命令,它还支持变量和控制语句,如if、do、for、while、case等。除此之外,Perl和Tcl等其他许多脚本语言也使用广泛。在面对复杂的GUI操作时可以采用sh脚本来帮助解决这个问题。

文件I/0操作

低级别文件操作

分区:

一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,成为分区。
分区表唯一第一个扇区的字节偏移446(0x1BE)处,成为设备的主引导记录(MBR)

格式化分区:

fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。该操作习惯上称为格式化磁盘或磁盘分区。在Linux中,它被称为mkfs,表示Make文件系统。Linux支持多种不同类型的文件系统。下面使用1440个块把vdisk格式化为ext2文件系统:

格式化后的磁盘应是只包含根目录的空文件系统。但是,Linux的mkfs始终会在根目录下创建一个默认的lost+found目录。完成mkfs之后,设备就可以使用了。在Linux中,还不能访问新的文件系统。它必须挂载到根文件系统中的现有目录中。/mnt目录通常用于挂载其他文件系统。由于虚拟文件系统不是真正的设备,它们必须作为循环设备挂载。下面把vdisk挂载到/mnt目录里边。

挂载分区

EXT2文件系统

Linux一直使用EXT2作为默认文件系统,EXT3是EXT2的扩展,增加的主要是一个日志文件,EXT4是EXT3的扩展,增加了磁盘块的分配(连续的)。

Block#0:引导块,文件系统不使用它,用于容纳从磁盘引导操作系统的引导程序。
Block#1:超级块,用于容纳关于整个文件系统的信息。
Block#2:块组描述符块,EXT2将磁盘分成几个组(每组8192块),每组用一个块组描述符结构体描述。
Block#8:块位图,用来表示某种项的位序列。
Block#9:索引节点位图,用来代表一个文件的数据结构。
Block#10:索引节点,每个文件都用一个128字节(EXT4的是256字节)的独特索引节点结构体表示。
直接块:指向直接磁盘块;
间接块:每个块编号指向一个磁盘块;
双重间接块:每个块指向256个磁盘块;
三重间接块:对于小型的“EXT2”文件系统,可以忽略这个块。
数据块:紧跟在索引节点块后面的是文件存储块。

第八章 使用系统调用进行文件操作

1.系统调用

简称syscall,是一种允许进程进入Kmode以执行Umode不允许操作的机制。

2.系统调用手册页

在Ubuntu Linux中,手册页保存在/usr/share/man目录中,man2子目录中列出了所有的系统调用手册页。

man 2 NAME :显示系统调用名称的手册页

3.使用系统调用进行文件操作

系统调用必须由程序发出,用法就像函数调用。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用。

4.常用的系统调用

stat:获取文件状态信息
open:打开一个文件进行读、写、追加
close:关闭打开的文件描述符
read:读取打开的文件描述符
write:写入打开的文件描述符
lseek:重新定位文件描述符的读/写偏移量
dup:将文件描述符复制到可用的最小描述符编号中
dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭
link:将新文件硬链接到旧文件
unlink:取消某个文件的链接,如果文件链接数为0,则删除文件
symlink:创建一个符号链接
readlink:读取符号链接文件内容
umask:设置文件创建掩码,文件权限为(mask&~umask)

5.链接文件

6.stat系统调用

stat文件状态
stat按文件名统计指向文件,并在缓冲区中填写stat信息
stat结构体
stat与文件索引节点
每个索引节点在存储设备上都有唯一的索引节点编号(ino)
文件类型和权限
st_mode是16位,前4位是文件类型,接下来的3位表示文件的特殊用法,其余9位是文件保护权限位。
opendir-readdir函数
readlink函数
ls程序