首页 > 系统相关 >Linux文件IO之一 [补偿-2023-07-21]

Linux文件IO之一 [补偿-2023-07-21]

时间:2024-01-13 16:44:07浏览次数:40  
标签:文件 07 表中 描述符 IO Linux 打开 inode 指针

Linux文件IO

8-1C标准库IO函数的工作流程

​ 使用fopen函数打开一个文件,之后会返回一个FILE* fp指针,fp指针指向一个结构体,这个结构体是c 标准io库中的一个结构体,这个结构体有三个重要的成员:

文件描述符:描述符指向一个打开文件表,通过此表可以找到文件的inode表,通过对应的inode可以找到 对应的文件数据块。

文件指针:读和写共享一个文件指针,并且读写过程中可以引起文件指针的变化。

文件缓冲区:在进行读写操作时,会先通过文件缓冲区,因为这样可以减少对磁盘的读写次数,等输入完再 真正地写入文件,提高读写磁盘的效率。

8-2标准库函数与系统函数之间的关系

​ 系统中内置了读写函数,并且提供了相应的api,我们只需调用标准库函数,标准库函数会帮我们调用系 统自带的api。

8-3虚拟地址空间

​ Linux会为每一个进程分配0到4g的独立内存,这个内存与其他的内存相隔开,相互之间不干扰。这块内 存上有着各种内存区域。

​ 进程的虚拟空间分为内核区(系统维护,用户没有权限对其操作) 和 用户区(这个可以进行操作)。

​ 内核区有着进程管理,内存管理等待其中进程管理中有PCB这么一个区域,以后再介绍他。

​ 用户区的内容:

​ 环境变量:不多说

​ 命令行参数: 不多说

​ 栈空间: 不多说,像局部变量或者递归会用到

​ 共享库:c标准库,系统的库在这里存放着

​ 堆空间:不多说

​ .bss未初始化全局变量 只读区域

​ .data已初始化全局变量 只读区域

​ .text代码段,二进制指令 只读区域

​ (0到4k)受保护的地址 只读区域

8-4pcb,文件描述符,文件描述符表,打开文件表与inode

pcb,文件描述符和文件描述表

​ 在虚拟地址空间的3-4G的这段空间中,有一个进程控制块,叫做PCB。它维护着一张文件描述符表。(一 个0~1023的数组)

​ 在linux中,所有打开的文件都有一个文件描述符,我们可以通过文件描述符对文件进行读写和访问。文 件描述符表中可以存储1021个文件描述符,其实可以存1024个,只不过前三个元素是固定的。

STDIN_FILENO 标准输入,在下标为0的文件描述符表中

STDOUT_FILENO 标准输出,在下标为1的文件描述符表中

STDERR_FILENO 标准错误,在下标为2的文件描述符表中

​ 每当打开一个文件时,系统就会自动分配最小未使用的文件描述符给打开的文件。我们可以调用系统的 open函数来得到一个文件描述符。

打开文件表:

​ 计算机中所有的进程都共享着一个打开文件表,打开文件表可能是数组,链表,哈希表等数据结构。每个 进程可以通过各自的文件描述符来访问打开文件表。打开文件表中有以下主要内容:

当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)

打开文件时所使用的状态标识(即,open()的flags参数)

文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)

与信号驱动相关的设置

对该文件i-node对象的引用

文件类型(例如:常规文件、套接字或FIFO)和访问权限

一个指针,指向该文件所持有的锁列表

文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳

indoe:

​ inode是文件系统中的数据结构,用于存储文件的元数据,如文件大小、权限、所有者等。每个文件都有 一个唯一的inode。打开文件表项中的指针指向对应文件的inode。

linux访问一个文件的具体步骤:

​ 当一个进程需要访问一个文件时,它会首先从自己的PCB中获取文件描述符表的指针。然后,通过文件描 述符表找到对应的文件描述符,该文件描述符指向进程的打开文件表中的一个项。该项中又包含了指向对应文 件的inode的指针。

标签:文件,07,表中,描述符,IO,Linux,打开,inode,指针
From: https://www.cnblogs.com/xiaobai1523/p/17962554

相关文章

  • MakeFile文件的使用 [补档-2023-07-13]
    makefile-gdb文件​可以在文件中指定那些文件可以先进行编译,那些文件可以后进行编译,那些文件可以重新编译。他可以自动化编译程序。。。。6-1makefile基本规则​如下:​目标:依赖​(tab)命令​规则三要素:目标:要生成的目标文件。依赖:目......
  • CF1284E New Year and Castle Construction
    NewYearandCastleConstructionLuoguCF1284E题目描述给定大小为\(N\)的点集\(S\)。保证点集中的任意三点不共线,且不存在重复的点。设\(f(p)\)表示满足如下条件的\(S\)的四元子集\(T\)的个数:\(T\subsetS\\landp\notinT\)\(T\)中的元素能组成一个四边形,......
  • Linux下的gcc/g++编译器的使用 [补档-2023-06-13]
    gcc编译器​这东西是Linux上的c/c++编译器。5-1gcc的工作流程5-2gcc的常用参数-v查看gcc版本号,--version也可以-E生成预处理文件-S生成汇编文件-c只编译,生成.o文件,通常称为目标文件-I指定头文件所在的路径-L指定库文件所在的路径-l指定库的名......
  • Linux系统的一些实用操作 [补档-2023-07-30]
    Linux的实用操作4-1.常用快捷键强制停止:当某些程序运行时,或者命令输入错误时,可以通过ctrl+c来强制结束当前的操作。退出或登出:当我们要退出某些用户时,或者要退出某些特殊的页面可以使用ctrl+d来进行。(vi/vim不可用)历史命令搜索:通过输入history命令来查看之前输入......
  • deveco studio 的安装步骤。
    步骤的截图;  这样就安装好了。记下来点击桌面图标       现就这样吧。  安装好了,接下来创建一个app测试一下。             是不是还需要我自己去安装一个虚拟机啥的。尝试一下。      ......
  • Linux的用户和权限 [补档-2023-07-07]
    Linux用户和权限3-1.su用户切换命令exit用户退出命令​用户切换命令的语法:​su[-][用户名]​其中:​-可选,表示是否在切换用户后加载环境变量,建议带上。​用户名可选,表示要切换到那个用户,如果不填则默认切换到root用户上。​......
  • mysql发生连接异常Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
    【问题背景】应用部署再ecs或者云上报错 Cause:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communicationslinkfailure用的是 数据库连接池(Druid) 背景信息 使用Druid作为数据库连接池时,在数据库宕机后再次恢复,应用无法获取数据库连接或获取的连接为失......
  • Linux 系统开机启动项清理
    通常情况下,你能用 /etc/init.d 查看系统引导时启动的服务项。但是systemd会用不一样的展现方式,下面是一些命令,用于展示开机启动时的进程项。你可以看到,这里头有一项是蓝牙,我不需要使用它,那么我应该怎样关闭并阻止它在开机时后启动?完成上面的操作之后,用下面的命令来确定自己是否......
  • vi / vim编辑器的使用 [补档-2023-07-01]
    vi/vim编辑器​vi/vim编辑器是linux中的文本编辑器,其中vim比vi的功能更加强大,可以编辑shell程序,推荐使用vim,下面也将介绍vim如何使用。2-1vi/vim的三种工作模式命令模式​在此模式下,所敲的每一个键都是一个命令,不可以进行文本编辑。比如输入w代表保存等待。输入......
  • 详解Linuxrc、rcS、rc.local、Profile
    /Linuxrc执行init进程初始化文件。主要工作是把已安装根文件系统中的/etc安装为ramfs,并拷贝/mnt/etc/目录下所有文件到/etc,这里存放系统启动后的许多特殊文件;接着Linuxrc重新构建文件分配表inittab;之后执行系统初始化进程/sbin/init。/mnt/etc/init.d/rcS完成各个文件系统的......