学习笔记四

学习笔记四

一、作业要求

自学教材第7、8章,提交学习笔记 (10分),评分标准如下:

  1. 知识点归纳以及自己最有收获的内容,选泽至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)

    我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题 核心是要求GPT:“请你以苏格拉底的方式对我进行提问" 然后GPT就会给你提问,如果不知道问题的答案,可以反问Al:“你的理解(回答) 是什么?如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?“ GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:"我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

  2. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图 (3分)

  3. 实践过程截图,代码链接 (2分)

  4. 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等) (1分)

二、教材知识点总结

1. 文件操作级别

文件操作分为五个级别,按照从低到高的顺序排列如下。

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

  • fdisk:将硬盘、U盘或SDC盘分区。

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

  • fsck:检查和维修系统。

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

    其中大多数是针对系统的实用程序。普通用户可能永远都不需要它们,但是它们是创建和维护系统不可缺少的工具。

(2)操作系统内核中的文件系统函数:每个操作系统内核均可为基本文件操作提供支持。下文列出了类Unix 系统内核中的一些函数,其中前缀k 表示内核函数。

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

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

FILEmode I/0: fopen(),fread(); Ewrite(),fseek(),fclose(),fflush()
char mode I/0: getc()getchar() ugetc(); putc(),putchar()
line mode I/0: gets(), fgets(); puts(), Eputs()
formatted I/0: scanf(),fscanf(),sscanf(); printf(),Eprintf(),sprintf()

(5)用户命令:用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。每个用户命令实际上是一个可执行程序(cd 除外)通常会调用库I/O函数,而库I/O函数再发出系统调用来调用相应的内核函数。

(6)sh 脚本:虽然比系统调用方便得多,但是必须要手动输人命令,如果使用的是 GUI,必须要拖放文件图标和点击指向设备来输人,操作烦琐而且耗时。sh 脚本是用 sh 编程语言编写的程序,可通过命令解释程序 sh 来执行。sh 语言包含所有的有效 Unix/Linux 命令。

2. 低级别文件操作

(1)分区

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

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

3. 位图

Block #8 块位图(Bmap) 位图用来表示某种项的位序列,例如磁盘块或索引节点。位图用于分配和回收项。在位图中,0表示对应项处于FREE状态,1表示处于IN_USE状态。1个软盘有1440个块,但Block#0未被文件系统使用,所以对应位图只有1439个有效位,无效位视作IN_USE处理,设置为1。

Block #9 索引节点位图(Imap) 一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9 中 Imap中的一个位表示。在EXT2 FS 中,前10个索引节点是预留的。所以,空EXT2 FS的Imap 以10个1开头,然后是0。无效位再次设置为1。

4.系统调用

(1)简单的系统调用
  • access:检査对某个文件的权限

int access(char *pathname, int mode);
  • chdir:更改目录

int chdir(const char *path);
  • chmod:更改某个文件的权限

int chmod(char *path, mode_t m);
  • chown:更改文件所有人

int chown(char *name, int uid, int gid);
  • chroot:将(逻辑)根目录更改为路径名

int chroot (char *patiiname);
  • getcwd:获取CWD的绝对路径名

char *getcwd(char *buf, int size);
  • mkdir:创建目录

int mkdir(char *pathname, mode_t mode);
  • rmdir:移除目录(必须为空)

int rmdir (char *pathname);
  • link:将新文件名硬链接到旧文件名

int link(char *oldpath, char *newpath);
  • unlink:减少文件的链接数;如果链接数达到0,则删除文件

int uniink(char *pathname);
  • symlink:为文件创建一个符号链接

int symliak(char *oldpath, char *newpath);
  • rename:更改文件名称

int rename(char *oldpath, char *newpath);
  • utime:更改文件的访问和修改时间

int utime(char *pathname, struct utimebuf *time)

以下系统调用需要超级用户权限:

  • mount:将文件系统添加到挂载点目录上

int mount(char *specialfile, char *mountDir);
  • umount:分离挂载的文件系统

int umount(char *dir);
  • mknod:创建特殊文件

int mknod(char *path, int mode, int device);
(2)常用的系统调用
  • stat:获取文件状态信息

int stat(char *filename, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(char *filename, struct stat *buf);
  • 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 fd, char buf[], int count);
  • lseek:重新定位文件描述符的读/写偏移量

int lseek(int fd, int offset, int whence);
  • dup:将文件描述符复制到可用的最小描述符编号中

int dup(int oldfd);
  • dup2:将oldfd复制到newfd中,如果文件链接数为0,则删除文件

int dup2(int oldfd, int newfd);
  • link:将新文件硬链接到旧文件

int link(char *oldPath, char *newPath);
  • unlink:取消某个文件的链接;如果文件链接数为0,则删除文件

int unlink(char *pathname);
  • symlink:创建一个符号链接

int symlink(char *target, char *newpath);
  • readlink:读取符号链接文件的内容

int readlink(char *path, char *buf, int bufsize);
  • umask:设置文件创建掩码;文件权限为(mask & ~umask)

int umask(int umask);

5. 链接文件

(1)硬链接
ln oldpath newpath

创建从newpath到oldpath 的硬链接。对应的系统调用为:

link(char *oldpath, char *newpath)

硬链接文件会共享文件系统中相同的文件表示数据结构(索引节点)。文件链接数会记录链接到同一索引节点的硬链接数量。硬链接仅适用于非目录文件。否则,它可能会在文件系统名称空间中创建循环,这是不允许的。相反,系统调用:

unlink(char *pathname)

会减少文件的链接数。如果链接数变为 0,文件会被完全删除。这就是 rm(le)命令的作用如果某个文件包含非常重要的信息,就最好创建多个链接到文件的硬链接,以防被意外删除。

(2)软链接
ln -s oldpath newpath             # ln command with the -s flag

创建从newpath到oldpath 的软链接或符号链接。对应的系统调用是:

symlink(char *oldpath, char *newpath)

newpath是LNK类型的普通文件,包含oldpath字符串。它可作为一个绕行标志,使访问指向链接好的目标文件。与硬链接不同,软链接适用于任何文件,包括目录。软链接在以下情况下非常有用。 ①通过一个较短的名称来访问一个经常使用的较长路径名称,例如:

x-> aVeryLongPathnameFile

②将标准动态库名称链接到实际版本的动态库,例如:

1ibc.so.6 -> libc.2.7.so

当将实际动态库更改为不同版本时,库安装程序只需更改 (软)链接以指向新安装的库

6. open-close-lseek 系统调用

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

    int open(char *file, int flags, int mode);
  • close:关闭打开的文件描述符

    int close(int fa);
  • read:读取打开的文件描述符

    int read(int fd, char buf[ ], int count);
  • write:写人打开的文件描述符

    int write(int fd,char buf[ ], int count);
  • lseek:将文件描述符的字节偏移量重新定位为偏移量

    int lseek(int fd,int offset, int whence);
  • umask:设置文件创建掩码;文件权限为(mask&~umask)

(1)打开文件和文件描述符
#include <sys/type.h>#include<sys/stat.h>
finclude <fcntl.h>
int open(char *pathname, int flags, mode_t mode)
(2)关闭文件描述符
#include <unistd.h>
int close(inf fd);

close()关闭指定的文件描述符fd,可重新用它来打开另一个文件。

(3)文件描述符
#include <sys/type.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

思维导图

 

 

三、实践截图与代码

1. 系统调用实现文件复制

2. 虚拟磁盘映像创建

 帮助文档说明:

 n命令:创建新分区

 p命令:打印分区

3. 利用chatgpt提问

 

 

posted @ 2023-09-26 16:27  20211307李文婧  阅读(12)  评论(0编辑  收藏  举报