20191305李天琦七、八章学习笔记

20191305李天琦七、八章学习笔记

第七章 文件操作

摘要:本章讨论了多种文件系统;解释了操作系统中的各种操作级别,包括为文件存储准备存储设备、内核中的文件系统支持函数、系统调用、文件流上的I/0库函数、用户命令和各种操作的sh脚本;系统性概述了各种操作,包括用户空间的文件流读/写到内核空间的系统调用,直到底层的设备I/O驱动程序级别;描述了低级别的文件操作,包括磁盘分区、显示分区表的示例程序、文件系统的格式化分区以及挂载磁盘分区;介绍了 Linux系统的EXT2文件系统,包括EXT2文件系统的系统数据结构、显示超级块、组描述符、块和索引节点位图以及目录内容的示例程序。编程项目将本章中讨论的EXT2/3文件系统和编程技术集中到一个程序中,将路径名转换为索引节点并打印它们的信息。

7.1文件操作级别

(1)硬件级别:硬件级别的文件操作包括:

Fdisk:将磁盘、U盘或SDC盘分区。

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

fsck:检查和维修系统。

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

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

每个操作系统内核均可为基本文件操作提供支持。

(3)系统调用

用户模式程序使用系统调用来访问内核函数

open()、read()、lseek()和close()函数都是c语言库函数,每个库函数都会发出一个系统调用,使进程进入内核模式来执行相应的内核函数,例如open可以进入kopen(),read可进入kread()函数等。

(4)I/O库函数

系统调用可让用户读/写多个数据块,这些数据块只是一系列字节。用户通常需要读/写单独的字符、行或数据结构记录等。如果只有系统调用,用户模式程序则必须自己从缓冲区执行这些操作。大多数用户会认为这非常不方便。为此,C语言库提供了一系列标准的I0函数,同时也提高了运行效率。

I/O库函数包括:

FILE mode I/O:fopen(),fread();fwrite(),fseek(),fclose(),fflush()

char mode I/O:getc(),getchar() ugetc();putc(),putchar()

line mode I/O:gets(),fgets();puts(),fputs()

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

(5)用户命令

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

(6)sh脚本

必须要手动输入命令。sh脚本是用sh编程语言编写的程序,可通过命令解释程序sh来执行。sh语言包含所有的有效Unix/Linux命令,它还支持变量和控制语句,如if、do、for、while、case等。

7.2文件I/O操作

(1)用户模式下的程序执行操作

FILE *fp = fopen(“file”,”r”);or FILE *fp = fopen(“file”,”w”);可以打开一个读/写文件流。

(2)fopen()在用户(heap)空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf[BLKSIZE]和一些控制变量。

(3)fread(ubuf,size,nitem,fp):将nitem个size字节读取到ubuf上。

(4)内核中的文件系统函数

假设非特殊文件的read(fd,fbuf[],BLKSIZE)系统调用。

(5)在read()系统调用中,fd是一个打开的文件描述符,它是运行进程的fd数组中的一个索引,指向一个表示打开文件的OpenTable。

(6)OpenTable包含文件的打开模式、一个指向内存中文件INODE的指针和读/写文件的当前字节偏移量。

(7)设备I/O:

I/O缓冲区上的物理I/O最终会仔细检查设备驱动程序,设备驱动程序由上半部分的start_io()和下半部分的磁盘中断处理程序组成。

7.3低级别文件操作

(1)分区

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

struct partition {

u8 drive;

u8 head;

u8 sector;

u8 cylinder;

u8 sys_type;

u8 end_head;

u8 end_sector;

u8 end_cylinder;

u32 start_sector;

u32 nr_sectors;

};

(2)格式化分区

(3)挂载分区

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

dd if =/dev/zero of=vdisk bs=1024 count=32768

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

Fdisk vdisk

(3)使用扇区数在vdisk的分区1上创建一个循环设备:

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

dd if =/dev/zero of=vdisk bs=1024 count=32768

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

Fdisk vdisk

(3)使用扇区数在vdisk的分区1上创建一个循环设备:

Losetup -o (expr 2048 * 512) --sizelimit $(expr 65535 * 512) /dev/loopl vdisk

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

Mke2fs -b 4096 /dev/loop1 7936

(5)挂载循环设备:

Mount /dev/loop1c/ mnt

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

(cd /mnt; mkdir bin boot dev etc user)

(7)设备使用完毕后,将其卸载。

Umount /mnt

(8)循环设备使用完毕后,通过以下命令将其断开:

Losetup -d /dev/loop1 (expr 2048 * 512) --sizelimit $(expr 65535 * 512) /dev/loopl vdisk

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

Mke2fs -b 4096 /dev/loop1 7936

(5)挂载循环设备:

Mount /dev/loop1c/ mnt

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

(cd /mnt; mkdir bin boot dev etc user)

(7)设备使用完毕后,将其卸载。

Umount /mnt

(8)循环设备使用完毕后,通过以下命令将其断开:

Losetup -d /dev/loop1

7.4EXT2文件系统简介

(1)EXT2文件系统数据结构

(2)超级块

(3)块组描述符

(4)位图

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

摘要:本章论述了如何使用系统调用进行文件操作;解释系统调用的作用和 Linux的在线手册页;展示了如何使用系统调用进行文件操作;列举并解释了文件操作中最常用的系统调用;阐明了硬链接和符号链接文件;具体解释了stat系统调用基于stat信息,开发了一个类似于s的程序来显示目录内容和文件信息;接着,讲解了pen- -close-lseek系统调用和文件描述符;然后,展示了如何使用读写系统调用来读写文件内容;在此基础上,说明了如何使用系统调用来显示和复制文件;还演示了如何开发选择文件复制程序,其行为类似于一个化的 Linux dd实用程序。编程项目使用 Linux系统调用来实现C程序,该程序将目录递归复制到目标中。该项目的目的是让读者练习程序的分层结构设计,并利用 statO、openrad()、 writef()系统调用进行文件操作。

8.1系统调用

在操作系统中,进程以两种不同的模式运行,即内核模式和用户模式,简称KMode和UMode。在 UMode中,进程的权限非常有限。它不能行任何需要特殊权限的操作。特殊权限的操作必须在KMode下执行。系统调用(简称syscall))是一种允许进程进入KMode以执行UMode不允许操作的机制。复刻子进程、修改执行映像,甚至是终止等操作都必须在内核中执行。

8.2系统调用手册页

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

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

链接文件

硬链接文件命令:

In oldpath newpath

软连接文件命令:

in -s oldpath newpath

open-close-lseek系统调用

open:打开一个文件进行读、写、追加

close:关闭打开的文件描述符

read:读取打开的文件描述符

write:写入打开的文件描述符

lseek:将文件描述符的字节偏移量重新定位成偏移量

umask:设置文件创建掩码;文件权限(mask&~umask)

posted @ 2021-10-10 20:05  20191305李天琦  阅读(47)  评论(0编辑  收藏  举报