Linux——基础IO(上)|语言层面如何访问文件|什么是一切皆文件|C语言文件操作复习|什么是当前路径|系统接口的使用|open|close|write|read|文(下)

简介: 笔记

write

向一个fd里写特定的buf,字符个数为conut

1.png2.png3.png

修改一下再写入

4.png5.png




我们发现是从头部开始写入,而不是删除后再写


这是因为我们加的指令不够

6.png7.png8.png

追加O_APPEND

9.png


read

10.png

11.png从特定文件描述符,读取数据到buf中,读count个

12.png13.png

read返回值是实际读到的字节数


文件描述符


我们发现上面打开文件后,描述符都是3

14.png15.png

文件描述符没有0,1,2


这是因为:0,1,2,分别对应stdin,stdout,stderr


证明:

16.png17.png

我们发现往标准输出和往1里面写,照样可以打印在显示器上

18.png19.png

我们输入123456,仍然可以打印出来

20.png21.png

此时仍然可以读取


int类型 0 1 2 和FILE*类型 stdin stdout stderr都可以读取


FILE*的FILE是一个struct结构体,是C标准库提供的,内部有多种成员


C文件库函数内部一定要调用系统调用,在系统角度,系统认的是fd而不是FILE


FILE结构体里面必定封装了fd


stdin/out/err内部绝对有fd

22.png23.png

fd的理解


进程要访问文件,必须先打开文件,一个进程可以打开多个文件,一般而言 进程:打开的文件=1:N,文件要被访问,前提是加载到内存当中


如果多个进程都要打开自己的文件,系统中会存在大量被打开的文件,所以,OS需要把如此多的文件管理起来,管理方式:先描述,再组织


在内核中,OS内部要为管理每一个被打开的文件,构建struct file结构体,打开一个文件就创建struct file的对象或变量,用来充当一个被打开的文件,结构体里面包含了一个被打开的文件的几乎所有的内容(不仅仅包含属性)


如果有很多创建的struct file,会用双链表组织起来

24.png

进程和文件的对应关系,用一个数组维护类型是struct file*

25.png


fd在内核中,本质是一个数组下标,系统通过数组下标,在数组中做哈希索引,就可以找到对应的打开的文件对象


结论:


当我们使用open打开文件的时候,内核中会创建一个文件对象,然后在数组里找一个没有被使用的格子,把这个格子的地址填到右侧创建的文件对象中,然后把对应的数组下标返回给用户。用户用数组下标就能调用接口,直接根据当前进程的PCB找到数组,然后根据数组索引到文件对象,文件对象中包含了文件的所有内容,找到文件之后,就可以进行操作

26.png

相关文章
|
10月前
|
Linux 开发工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
|
8月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
1246 13
|
9月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
264 16
|
10月前
|
Linux
【Linux】 Linux文件I/O常见操作技巧
以上就是Linux文件I/O操作的一些技巧,接纳它们,让它们成为你在Linux世界中的得力伙伴,工作会变得轻松许多。不过记住,技巧的运用也需要根据实际情况灵活掌握,毕竟,最适合的才是最好的。
280 28
|
9月前
|
存储 Linux 数据处理
深入剖析Linux中一切即文件的哲学和重定向的机制
在计算机的奇妙世界中,Linux的这套哲学和机制减少了不同类型资源的处理方式,简化了抽象的概念,并蕴藏着强大的灵活性。就像变戏法一样,轻轻松松地在文件、程序与设备之间转换数据流,标准输入、输出、错误流就在指尖舞动,程序的交互和数据处理因此变得既高效又富有乐趣。
153 4
|
10月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
2048 12
|
9月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename 's/2023/2024/' *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
9月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
200 0
|
9月前
|
存储 Linux Shell
Linux的基础IO
那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。
127 0
|
9月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
282 0