首页 > 系统相关 >Unix/Linux系统编程第七八章

Unix/Linux系统编程第七八章

时间:2023-10-05 17:00:13浏览次数:34  
标签:文件 八章 int 文件系统 char Unix 调用 内核 Linux

第七章 文件操作

7.1文件操作级别

文件操作分为五个级别
(1)硬件级别:

  • fdisk:将硬盘、U盘或SDC盘分区。
  • mkfs:格式化磁盘分区,为系统做好准备。
  • fsck:检查和维修系统。
  • 碎片整理:压缩文件系统中的文件。

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

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

kumount(),kumount()
                  (mount/umount file systems)
kmkdir(),krmdir()
                    (make/remove directory)
kchair(),kgetCwd()
                   (change directory,get CWD pathname)

klink(),kunlink()
                    (hard link/unlink files)

kchmod(),kchown(),kutime()           (change r|w|x permissions,owner,time)
kcreat(),kopen()
                     (create/open file for R,W,RW,APPEND)
kread(),kwrite()                     (read/write opened files)
klseek(),kclose()                    
(Lseek/close file descriptors)
keymlink(),kreadlink ()
              (create/read symbolic 1ink files)

kstat(),kfstat(),klatat()            (get file status/information)
kopendir(),kreaddir()
                (open/read directories)


(3)系统调用

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

(4)1/O库函数:

存在内置的标准1/O函数,提高了运行效率。 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(),sscanf(); printf(),fprintf(),sprintf()

(5)用户命令:

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

mkdir, rmdir,cd,pwd,ls,link,unlink,rm,cat,cp,mv chmod,etc

(6)sh脚本

7.2 文件I/O操作

文件操作示意图

用户模式下的操作:

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

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

(2)fopen()在用户(heap)空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf[BLKSIZE]和一些控制变量。它会向内核中的kopen()发出一个fd = open("file",flags=READ or WRITE)系统调用,构建一个OpenTable来表示打开文件示例。OpenTable的mptr指向内存中的文件INODE。对于非特殊文件,INODE 的i_block数组指向存储设备上的数据块。成功后,fp会指向FILE结构体,其中fd是open()系统调用返回的文件描述符。

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

  • 将数据从FILE结构体的fbuf上复制到ubuf上,若数据足够、则返回。

  • 如果fbuf没有更多数据,则执行(a)。

(4a)发出read(fd, fbuf, BLKSIZE)系统调用,将文件数据块从内核读取到fbuf上,然后将数据复制到ubuf上,直到数据足够或者文件无更多数据可复制。

(4b)fwrite(ubuf, size, nitem, fp):将数据从ubuf复制到 fbuf。

  • 若(fbuf有空间):将数据复制到fbuf上,并返回。

  • 若(fbuf已满):发出 write(fd, fbuf, BLKSIZE)系统调用,将数据块写入内核,然后再次写入fbuf。

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

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

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

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

  • 计算逻辑块编号lbk。

  • 通过 INODE.i_block[]数组将逻辑块编号转换为物理块编号blk 。

(8)Minode包含文件的内存INODE。EMODE.i_block[]数组包含指向物理磁盘块的指针。文件系统可使用物理块编号从磁盘块直接读取数据或将数据直接写入磁盘块,但将会导致过多的物理磁盘I/O。

(9)为提高磁盘VO效率,操作系统内核通常会使用一组I/O缓冲区作为高速缓存,以减少物理I/O的数量。

(9a)对于read(fd,buf,BLKSIZE)系统调用,要确定所需的(dev,blk)编号,然后查询I/O缓冲区高速缓存

(9b)对于write(fd,buf,BLKSIZE)系统调用,要确定所需的(dev,blk)编号,然后查询I/O缓冲区高速缓存

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

7.3 低级别文件操作

7.3.1 分区

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

7.3.2 格式化分区

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

7.4 EXT2文件系统简介

  • Block#0:
    引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。
  • Block#1:
    超级块(在硬盘分区中字节偏移量为1024)。用于容纳关于整个文件系统的信息。
  • Block#2:
    块组描述符(硬盘上的s_first_data_blocks-1)EXT2将磁盘块分成几个组,每个组有8192个块(硬盘上的大小为32K)
  • 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个索引节点是预留的。所以,空EXT2FS的Imap 以10个1开头,然后是0。无效位再次设置为1。
  • Block #10:索引(开始)节点块(bg_inode_table)
    每个文件都用一个128字节(EXT4中的是256字节)的独特索引节点结构体表示。

i_block[15]数组包含指向文件磁盘块的指针,有

  • 直接块:i block[0] 至 i-block[11],指向直接磁盘块。
  • 间接块:i-block[12]指向一个包含256个块编号(对于1KB BLKSIZE)的磁盘块每个块编号指向一个磁盘块。
  • 双重间接块:i block[13]指向一个指向 256 个块的块,每个块指向 256 个磁盘块·三重间接块:i block[14] 是三重间接块。对于“小型”EXT2 文件系统,我们可以忽略它。

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

8.1系统调用

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

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

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

 int syscall(int a,int b,int c,int d);

第一个参数a是系统调用编号,b、c、d是对应内核函数的参数。内核的系统调用处理程序根据系统调用编号将调用路由到一个相应的内核函数。当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果。返回值≥0表示成功,-1表示失败。如果失败,errno变量(在errno.h中)会记录错误编号,它们会被映射到描述错误原因的字符串。

简单的系统调用

access 检查对某个文件的权限 int access(char *pathname, int mode);
chdir 更改目录 int chdir(const char *path);
chmod 更改某个文件的权限 int chmod(char *path, mode_t mode);
chown 更改文件所有人 int chown(char *name, int uid, int gid);
chroot 将(逻辑)根目录更改为路径名 int chroot(char *pathname);
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 unlink(char *pathname);
symlink 为文件创建一个符号链接 int symlink(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);
mknod 创建特殊文件

8.5 链接文件

在Unix/Linux中,每个文件都有一个路径名。但是,Unix/Linux允许使用不同的路径名来表示同一个文件。这些文件叫做LINK(链接)文件。有两种类型的链接,即是硬链接和软链接或符号链接。

硬链接文件

硬链接:命令
ln oldpath newpath
创建从newpath到oldpath的硬链接。对应的系统调用为:
link(char *oldpath, char *newpath)

符号链接文件

软链接:命令
ln -s oldpath newpath #ln command with the -s flag
创建从newpath到oldpath的软链接或符号链接。对应的系统调用是:
symlink(char *oldpath, char *newpath)

向chatgpt提问

  • 1

  • 2

标签:文件,八章,int,文件系统,char,Unix,调用,内核,Linux
From: https://www.cnblogs.com/Semelia/p/17730795.html

相关文章

  • linux服务器关闭ipv6
    现在ipv6越来越普及,但仍然有很多网站不支持,有时候服务器开启了ipv6,默认会通过ipv6的出口请求访问,可能会造成访问慢,api接口ip受限等问题,所以有时候反而需要关闭ipv6,ssh登陆到服务器,复制以下命令回车执行即可关闭。wget -O disable_ipv6.sh http://downinfo.myhostadmin.net/vps......
  • 多IP应用云主机切换出口IP地址[Linux系统教程]
    1.查看外网网卡设备和网关执行命令: iprouteshow2.更换出口ip为 211.149.140.130执行命令:iproutechangedefaultvia 211.149.140.1 dev eth0 src 211.149.140.1303.查看结果执行命令: iprouteshow......
  • NOI Linux 使用
    转载自这里一、Linux的基本操作(命令行)打开命令行在NoiLinux中可以使用快捷键Ctrl+Alt+T打开命令行终端Linux的目录Linux是没有Windows下硬盘分区的概念的,所有设备均会被挂载到一个统一的文件系统,Linux下的目录有两种:绝对目录:相对于文件系统的根目录/......
  • linux 进程切换和线程切换
    进程切换分两步:1.切换页目录以使用新的地址空间2.切换内核栈和硬件上下文对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。切换的性能消耗:1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内......
  • Linux命令
    1.文件相关lsll显示目录中文件及其属性信息mkdirname:创建目录cp源文件名目标文件名:复制mv源文件名目标文件名:移动文件unzipname.zip:解压2.文件查看tail[参数]文件名:查看文件尾部内容参数:-f持续显示文件尾部最新内容-n设置显示文件尾部的行数vi......
  • linux 执行脚本报错 No such file or directory (转)
    windows下编辑的脚本,拿到linux上面执行windows下的换行符为\r\n ,叫做CRLF      linux下的换行符为\n,叫做LF需要进行转换 解决办法:用vim打开该sh文件,输入::setff 回车,显示fileformat=dos,重新设置下文件格式::setff=unix 保存退出 转自: https://www......
  • Linux运维学习笔记
    此笔记为学习https://www.bilibili.com/video/BV1nW411L7xm/?vd_source=3f851e85e66ef33269a2eefee664cec2的学习记录,目前持续更新中,希望能找到运维的实习吖 O(≧▽≦)OLinux的终端终端组成部分Linux关机命令shoutdown-hnow(正常关机)halt(关闭内存)init0使用VMware备......
  • Linux网络编程
    http请求主要是客户端B/S都是http协议,一种数据包格式服务器端做出响应 get请求不用提交数据,post需要请求行分为三部分 请求方式get是静态资源请求,这个刚代表资源目录,随便那个目录,而不是服务器的根目录第三个是协议版本,现在一般都是1.1版本看不见的?R/n一定要注意get......
  • linux 中设置用户间针对单一目录的权限
     001、创建两个测试用户[root@pc1home]#ls[root@pc1home]#useradduser01##创建两个测试用户[root@pc1home]#useradduser02[root@pc1home]#echotmppasswd|passwd--stdinuser01Changingpasswordforuseruser01.passwd:allauthentication......
  • Linux相关学习(vmware安装)
    Linux系统一切皆文件(模板机:1.配置IP地址;2.关闭防火墙、selinux安全加载机制)一、配置IP地址cd/etc/sysconfig/network-scripts/lsifcfg-eth0文件解析(网卡配置文件):if:interface接口cfg:config配置eth:ethernet以太网0:第一块网卡viifcfg-eth0按“i”转换为输入模......