学习笔记四
一、作业要求
自学教材第7、8章,提交学习笔记 (10分),评分标准如下:
-
知识点归纳以及自己最有收获的内容,选泽至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)
我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题 核心是要求GPT:“请你以苏格拉底的方式对我进行提问" 然后GPT就会给你提问,如果不知道问题的答案,可以反问Al:“你的理解(回答) 是什么?如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?“ GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:"我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
-
问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图 (3分)
-
实践过程截图,代码链接 (2分)
-
其他(知识的结构化,知识的完整性等,提交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提问
标签:char,调用,文件,int,笔记,学习,描述符,链接 From: https://www.cnblogs.com/llwwjj/p/17730403.html