首页 > 其他分享 >学习笔记四

学习笔记四

时间:2023-09-26 16:48:40浏览次数:30  
标签:char 调用 文件 int 笔记 学习 描述符 链接

学习笔记四

一、作业要求

自学教材第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提问

 

 

标签:char,调用,文件,int,笔记,学习,描述符,链接
From: https://www.cnblogs.com/llwwjj/p/17730403.html

相关文章

  • 《流畅的Python》 读书笔记 230926(第一章后半部分)
    1.2如何使用特殊方法特殊方法的存在是为了被Python解释器调用的,你自己并不需要调用它们就是说通常你都应该用len(obj)而不是obj.__len()__,无论是系统预置的,还是你自己定义的类,交给Python,解释器会去调用你实现的__len()__然而如果是Python内置的类型,比如列表(list)、字符......
  • 学习cillium开源项目tetragon
    部署安装安装很方便,注意环境要求,官方说明文档基于的内核版本是ubuntu5.19.0.可参考https://tetragon.cilium.io/docs/getting-started/kubernetes-quickstart-guide/.安装完成后,查看tetragon监听端口如下所示:#netstat-apn|greptetragontcp00127.0.0.1:5432......
  • Hive数据仓库的学习--DDL部分
    1、建表语法2、数据类型转换函数CAST--也就是强制转换例如,CAST('100'ASINT)3、有关于SerDe的描述序列化和反序列化————用于从文件中读取和数据写入文件的操作(通俗来说,就是分辨分隔符,读取有效数据存储到数据库中);4、rowformat指定具体的分隔符是什么样子的;默认分隔......
  • 唐老狮Unity基础笔记
    唐老狮Unity基础笔记三角函数Mathf.Rad2DegMathf.Deg2Rad 坐标系 向量    ......
  • 【Linux学习】—Linux常用指令
    【Linux学习】—Linux常用指令⛳️大家好,我是王同学,今天给大家分享的是常用的Linux知识点总结,文章没有一点套路,只有满满的干货......
  • Linux shell编程学习笔记1:关于shell的前世今生
    一、什么是Shell?Shell英文单词的原意是“外壳”,在计算机领域专指在操作系统(OperatingSystem)外层,提供用户界面(UserInterface)的程序,主要负责将用户的命令(Command)转化为操作系统可识别的指令(Instruction)。二、UnixshellUnix诞生于1969年,是最早提供shell,从而将操作系统和用户界面......
  • 《流畅的Python》 读书笔记 230926
    写在最前面的话缘由关于Python的资料市面上非常多,好的其实并不太多。个人认为,基础的,下面的都还算可以B站小甲鱼黑马的视频刘江的博客廖雪峰的Python课程进阶的更少,《流畅的Python》应该算一个。加上,自己也很久没有耐心的看完一本书了鉴于以上2点,2023-9-26开始在这里跟......
  • Service mesh 学习03 Istio安装
    一、Kubernetes环境......
  • Docker 学习笔记(一)
    一、Docker和虚拟机有什么区别初次看到Docker的功能,直觉就是:这是简化版的虚拟机!但它和虚拟机是有本质区别的,最根本的区别在于:虚拟机真的是完全虚拟出一台电脑,普通PC机有啥,它就给你虚拟出啥来,我们几乎可以在上面安装普通PC上的任何操作系统和软件;而Docker只是做出一个进程之间......
  • Python学习笔记
    pip安装包命令pipinstallnumpy-ihttps://pypi.douban.com/simple#安装(指定国内源来安装)pipinstall--upgradenumpy#升级pipuninstallnumpy#卸载piplist#查看piplist-o#查看需要被升级的包pipshow-fnumpy#查看某个包的信息pipchecknumpy#查看兼容问......