第四周Linux教材第七、八章学习笔记——文件操作、系统调用

发布时间 2023-10-01 18:54:42作者: 20211115fyq

第七章

7.1  文件操作级别

文件操作分5个级别(从低到高):

(1)硬件级别

文件操作包括:fdisk——将硬盘、U盘或SDC盘分区;

                         mkfs——格式化磁盘分区,为系统做好准备;

                         fsck——检查和维修系统;

                         碎片整理——压缩文件系统中的文件。

(2)操作系统内核中的文件系统函数:每个系统操作内核均可为基本文件操作提供支持。Unix系统内核中的函数有(前缀k表示内核函数):

 (3)系统调用:用户模式程序使用系统调用来访问内核函数。

   

 此程序可读取文件的1024字节,但编译后显示出现错误:

 (4)I/O库函数:系统调用可让用户读/写多个数据块,这些数据快只是一系列字节。

C语言提供了一系列标准的库函数,提高了运行效率。

 除了读/写内存位置的sscanf()/sprintf()函数之外,所有其他的I/O库函数都建立在系统调用之上,也就是说,它们最终会通过系统内核发出实际数据传输的系统调用。

(5)用户命令:用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。

用户命令的示例有:mkdir , rmdir , cd , pwd , ls , link , unlink , rm , cat , cp , mv , chmod ……

每个用户命令实际上是一个可执行程序(cd除外),通常会调用I/O库函数,而I/O库函数再发出系统调用来调用相应的内核函数。用户命令的处理顺序为:

 (6)sh脚本:虽然比系统调用方便,但是要手动输入命令。sh脚本广泛应用于Linux系统编程。除了sh之外,Perl和Tel等其他脚本语言也使用广泛。

7.2  文件I/O操作

下图为文件I/O操作示意图:

 7.3  低级别文件操作

 7.3.1  分区

一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,称为分区。各分区均可以格式化为特定的文件系统,也可以安装在不同的操作系统上。分区表位于第一个扇区的字节偏移446(0xIBE)处,该扇区称为设备的主引导记录(MBR)。表有4个条目,每个条目有一个16字节的分区结构体定义,即:

 也可形成扩展分区链表:

 在Linux下创建一个名为mydisk的虚拟磁盘映像文件并在磁盘映像文件上运行fdisk:

 编写一个C程序,虚拟磁盘映像的分区和扩展分区,其格式与fdisk相同显示:

(1)访问MBR中的分区表:

 (2)假设P4是start_sector=n的扩展类型(类型=5)。

 (3)扩展分区形成一个“链表”,以一个NULL“指针”结束。

 7.3.2  格式化分区

 7.3.3  挂载分区

(1)用dd命令创建一个虚拟磁盘映像:

(2)在vdisk上运行fdisk来创建一个分区P1:

 创建分区P1,将分区表写入vdisk并退出fdisk:

 (3)创建循环设备并读进程:

 (4)格式化 /dev/loop1,它是一个EXT2文件系统:

该分区的大小是63488个扇区。4KB块的扇区大小是63488 / 8=7936。

 (5)挂载循环设备:

 (6)访问作为文件系统一部分的挂载设备:

 (7)设备使用完毕后,使用命令umount /mnt 将其卸载。

(8)循环设备使用完毕后,使用命令losetup -d /dev/loop1 将其断开。

7.4  EXT2文件系统简介

 创建一个包含简单EXT2文件系统的虚拟磁盘:

 这种EXT2文件系统的布局如图:

  • Block#0:引导块——文件系统不会使用它,它用于容纳从磁盘引导操作系统的引导程序。
  • Block#1:超级块——用于容纳关于整个文件系统的信息。

    

  • Block#2:块组描述符块——EXT2将磁盘块分成几个组,每个组有8192个块,每组用一个块组描述符结构体描述。
  • Block#8:块位图——用来表示某种项的位序列。
  • Block#9:索引节点位图——一个索引节点就是用来代表一个文件的数据结构。
  • Block#10:索引(开始)节点块——每个文件都用一个128字节的独特索引点结构体表示。

第八章

8.1  系统调用

8.2  系统调用手册页

8.3  使用系统调用进行文件操作

 成功创建newdir文件:

8.4  常用的系统调用

8.5  链接文件

有两种类型的链接:硬链接、软连接(或符号链接)

8.5.1  硬链接

ln  olspath newpath对应的系统调用为link(char *oldpath, char *newpath)

8.5.2  软连接

命令ln -s oldpath newpath对应的系统调用是symlink(char *oldpath,char *newpath)

8.6  stat系统调用

利用man 2 stat命令显示stat系统调用手册页:

 向ChatGpt请求苏格拉底式询问

 学习总结

有关文件操作的知识点还需加强记忆,系统调用这一章还有许多不理解的地方,还需进行深入学习。