首页 > 系统相关 >《Unix/linux系统编程》教材第7、8章学习笔记

《Unix/linux系统编程》教材第7、8章学习笔记

时间:2023-09-28 12:44:55浏览次数:40  
标签:文件 调用 编程 系统 fbuf 链接 Unix linux 描述符

第七章:文件操作

文件操作级别
(1)硬件级别
fdisk:将硬盘、U盘或SDC盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检 查和维修系统
碎片整理:压缩文件系统中的文件
(2)操作系统内核中的文件系统函数
前缀为k表示内核函数

(3)系统调用:用户模式程序使用系统调用来访问内核函数
open()、read()、lseek()、close()
(4)I/O库函数
FILE:fopen()、fread();fwrite()、fseek()、fclose()、fflush()
char:getc()、getchar()、ugetc()、putc()、putchar()
line:gets()、fgets()、puts()、fputs()
formatted:scanf()、fscanf()、sscanf()、printf()、fprintf()、sprintf()
(5)用户命令
mkdir,rmdir,cd,pwd,ls,link,unlink,rm,cat,cp,mv,chmod,etc.
(6)sh脚本

文件I/O操作

(1)用户模式下的程序执行操作
FILE Ep = fopen ("file","r"); or 室ILEEp = fopen ( "tile","w"');
可以打开一个读/写文件流。
(2)fopen()在用户( heap)空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf [BLKSIZE]和一些控制变量。
(3)fread(ubuf, size, nitem, fp):将nitem个size字节读取到ubuf上,通过:·将数据从FILE结构体的fbuf上复制到ubuf上,若数据足够,则返回。·如果 fbuf没有更多数据,则执行(4a)。
(4a)发出read(fd,fbuf, BLKSIZE)系统调用,将文件数据块从内核读取到 fbuf上,然后将数据复制到ubuf上,直到数据足够或者文件无更多数据可复制。
(4b)fwrite(ubuf, size, nitem, fp):将数据从ubuf复制到fbuf。

  • 若(fbuf有空间):将数据复制到fbuf 上,并返回。
  • 若(fbuf已满):发出 write(fd,fbuf,BLKSIZE)系统调用,将数据块写入内核,然后再次写入fbuf。
    这样,fread()/fwrite()会向内核发出read(/write)系统调用,但仅在必要时发出,而且它们会以块集大小来传输数据,提高效率。同样,其他库I/O函数,如 fgetc/fputc、fgetsllputs、fscanf/fprintf等也可以在用户空间内的FILE结构体中对fbuf进行操作。

(5)内核中的文件系统函数:
假设非特殊文件的 read(fd, fbuf[ ], BLKSIZE)系统调用。
(6)在read()系统调用中,fd是一个打开的文件描述符,它是运行进程的f数组中的一个索引,指向一个表示打开文件的OpenTable。
(7)OpenTable包含文件的打开模式、一个指向内存中文件INODE的指针和读/写文件的当前字节偏移量。从 OpenTable的偏移量,
·计算逻辑块编号1bk。
·通过INODE.i_block[ ]数组将逻辑块编号转换为物理块编号blk。
(8)Minode包含文件的内存 INODE。EMODE.i_block[ ]数组包含指向物理磁盘块的指针。文件系统可使用物理块编号从磁盘块直接读取数据或将数据直接写入磁盘块,但将会导致过多的物理磁盘I/O。
(9)为提高磁盘IO效率,操作系统内核通常会使用一组IO缓冲区作为高速缓存,以减少物理I/O的数量。磁盘I/O缓冲区管理将在第12章中讨论。
(9a)对于read(fd, buf, BLKSIZE)系统调用,要确定所需的(dev,blk)编号,然后查询I/O缓冲区高速缓存。
(9b)对于write(fd, fbuf, BLKSIZE)系统调用,要确定需要的(dev,blk)编号,然后查询I/O缓冲区高速缓存。
(10)设备I/O:I/O缓冲区上的物理IO最终会仔细检查设备驱动程序,设备驱动程序由上半部分的start_io()和下半部分的磁盘中断处理程序组成。

低级别文件操作

  • 分区
    一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,称为分区。分区表唯一第一个扇区的字节偏移446(0x1BE)处,成为设备的主引导记录(MBR)。

  • 格式化分区
    为了存储文件,必须先为特定的文件系统准备好分区,该操作成为格式化磁盘或磁盘分区。在Linux中,称为mkfs,表示Make文件系统。

  • 挂载分区

EXT2文件系统简介
Linux一直使用EXT2作为默认文件系统,EXT3是EXT2的扩展,增加的主要是一个日志文件,EXT4是EXT3的扩展,增加了磁盘块的分配(连续的)。

  • EXT2文件系统数据结构
    创建一个包含简单EXT2文件系统的虚拟盘

磁盘块的内容:
Block#0:引导块,文件系统不使用它,用于容纳从磁盘引导操作系统的引导程序。

  • 超级块
    Block#1:超级块,用于容纳关于整个文件系统的信息。
  • 块组描述符
    Block#2:块组描述符块,EXT2将磁盘分成几个组(每组8192块),每组用一个块组描述符结构体描述。
  • 位图
    Block#8:块位图,用来表示某种项的位序列。
    Block#9:索引节点位图,用来代表一个文件的数据结构。
  • 索引节点
    Block#10:索引节点,每个文件都用一个128字节(EXT4的是256字节)的独特索引节点结构体表示。

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

系统调用
在操作系统中,以内核模式和用户模式运行,简称Kmode和Umode。系统调用简称syscall,是一种允许进程进入Kmode以执行Umode不允许操作的机制。

系统调用手册页
在Ubuntu Linux中,手册页保存在/usr/share/man目录中,man2子目录中列出了所有的系统调用手册页。
sh命令man 2 NAME 显示了系统调用名称的手册页。

使用系统调用进行文件操作
系统调用必须由程序发出,用法就像函数调用。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用。

常用的系统调用
stat:获取文件状态信息
open:打开一个文件进行读、写、追加
close:关闭打开的文件描述符
read:读取打开的文件描述符
write:写入打开的文件描述符
lseek:重新定位文件描述符的读/写偏移量
dup:将文件描述符复制到可用的最小描述符编号中
dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭
link:将新文件硬链接到旧文件
unlink:取消某个文件的链接,如果文件链接数为0,则删除文件
symlink:创建一个符号链接
readlink:读取符号链接文件内容
umask:设置文件创建掩码,文件权限为(mask&~umask)

链接文件
有硬链接和软链接或符号链接。

  • 硬链接文件
    ln oldpath newpath
    创建从newpath到oldpath的硬链接。对应的系统调用为:
    link(char *oldpath,char *newpath)
    unlink(char *pathname)则会减少文件的链接数。

  • 符号链接文件
    ln -s oldpath newpath
    创建从newpath到oldpath的软链接或符号链接。对应的系统调用为:
    symlink(char *oldpath,char *newpath)

stat系统调用
stat/lstat/fstat系统调用可将一个文件的信息返回。

  • stat文件状态

stat按文件名统计指向文件,并在缓冲区中填写stat信息

  • stat结构体
    所有的stat系统调用都以stat结构体形式返回信息,其中包含以下字段:

  • stat与文件索引节点
    每个节点都有一个独有的索引节点数据结构。

每个索引节点在存储设备上都有唯一的索引节点编号(ino)。

  • 文件类型和权限
    只有st_mode字段需要进行说明:
    16位,前4位是文件类型,接下来的3位表示文件的特殊用法,其余9位是文件保护权限位。

  • opendir-readdir函数

  • readlink函数
    读取符号链接文件的内容,必须使用readlink系统调用,即:
    int readlink(char *pathname,char buf[],int bufsize);
    将符号连接文件的内容复制到buf中,并将世纪复制的字节返回。

open-close-lseek系统调用
open:打开一个文件,读、写、追加
close:关闭打开的文件描述符
read:读取打开的文件描述符
write:写入
lseek:将文件描述符的字节偏移量重新定位为偏移量
umask:设置文件创建掩码;

gpt苏格拉底问答

文件I/O操作:



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



实践及操作

标签:文件,调用,编程,系统,fbuf,链接,Unix,linux,描述符
From: https://www.cnblogs.com/weidaixdrx/p/17735161.html

相关文章

  • ORACLE 11204 for Linux(RAC) 环境配置及数据库参数最佳实践
    ORACLE11204forLinux(RAC)环境配置及数据库参数最佳实践针对Linux6.6(+)版本:1、Linux内核参数配置vm.dirty_ratio=20vm.dirty_background_ratio=3vm.dirty_writeback_centisecs=100vm.dirty_expire_centisecs=500vm.swappiness=10vm.min_free_kbytes=524288##需要根据SGA......
  • Linux TLB 刷新的懒惰模式【转】
    转自:https://blog.csdn.net/Henzox/article/details/41963271我们都知道,在切换页表时会刷新TLB,这样就可以使用新的地址空间,那什么是TLB刷新的懒惰模式呢?TLB是什么这里不作多的解释,可以简单理解为,为了加快MMU对虚拟地址的转换而增加的缓存,它记录了一个虚拟地址......
  • 深入Linux内核(进程篇)—进程切换之ARM体系架构【转】
    转自:https://blog.csdn.net/liyuewuwunaile/article/details/106773630进程切换一、context_switch二、switch_mm2.1刷新I-CACHE2.2ASID和TLB2.3页表转换基址切换三、switch_to进程切换由两部分组成:切换页全局目录安装一个新的地址空间;切换内核态堆栈及硬件上下文。一、conte......
  • “国产双系统”出炉,RK3568J非对称AMP:Linux+RTOS/裸机
    “非对称AMP”双系统是什么AMP(AsymmetricMulti-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如Linux+RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的内存,既可各......
  • linux命令之系统操作历史
    history显示代时间戳的记录exportHISTTIMEFORMAT='%F%T'history|more更多参考 https://blog.51cto.com/leonkuo/950208who查看当前在线who查看历史登录who/var/log/wtmp......
  • Linux centos7内核升级 简单快速的方法
     Linux是支持多版本内核共存的,无非是系统启动的时候应用哪个版本内核而已。关于内核:Linux内核分两种:官方内核(通常是内核开发人员用)和各大Linux发行版内核(一般用户常用)。 关于Linux内核版本号:例如:[root@centos7~]#uname-r3.10.0-1127.19.1.el7.x86_64查询得到的版本号......
  • Linux 操作另一台服务器
    服务器信任在运维场景中,如果需要在一台服务器操作另一台服务器,就需要目标服务器(下面称为B服务器)信任当前服务器(下面称为A服务器)。在A服务器生成证书。ssh-keygen-trsa一直回车结束。会在/root/.ssh目录下生成id_rsa和id_rs.pub两个文件:id_rsa为私钥。id......
  • 一文搞懂Java异步编程之FutureTask(转)
    背景Java异步编程的在实际开发中经常被用到,那么异步任务执行结束如何将结果通知到主线程或者其他任务呢?本文不探讨JUC包下的各类锁实现实现的任务同步或者通知。一、Thread狭隘的讲Java创建线程的方式只有一种,就是newThread实例。Thread本身是Runnable的实现并且它定义了Runna......
  • 6-Linux操作系统 用户与用户组
    一、介绍说明  Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。  用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组......
  • Linux中C程序的编译与运行
    C程序编译的完整过程如下图所示1、编译C文件,生成可执行文件gccmine.c-omine2、运行程序./mine3、编译并运行gccmine.c-omine&&./mine4、编译C程序,生成目标文件gcc-cmine.c-omine.o5、链接目标文件,生成可执行文件,同编译C文件一样。gccmine.o-omine......