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

相关文章
|
5月前
|
域名解析 网络协议 安全
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
|
4月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
5月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
5月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
5月前
|
JavaScript Linux 应用服务中间件
【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题
【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题
|
5月前
|
机器学习/深度学习 Ubuntu Linux
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
|
4月前
|
存储 移动开发 Linux
C语言 IO操作
本文详细介绍了C语言中的输入输出(IO)操作,包括系统调用和库函数的区别及其应用场景。系统调用如`open()`、`read()`等直接与操作系统内核交互,适用于需要较高权限的操作,但性能开销较大;库函数如`fopen()`、`fread()`等则提供了更高层次的封装,易于使用但可能引入额外开销。文章还介绍了文件流的概念,区分了文本文件和二进制文件,并解释了乱码产生的原因。此外,还探讨了文件缓冲机制的重要性以及文件的打开、关闭操作,并通过示例代码展示了如何进行字符级别的读写、逐行读写以及二进制数据的读写。
|
5月前
|
JavaScript Linux 容器
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
|
5月前
|
监控 网络协议 Linux
在Linux中,如何使用 tcpdump 嗅探 80 端口的访问看看谁最⾼?
在Linux中,如何使用 tcpdump 嗅探 80 端口的访问看看谁最⾼?
|
5月前
|
网络协议 Linux
在Linux中,如何使用iptables 写⼀条规则?把来源IP为192.168.1.101访问本机80端口的包直接拒绝.
在Linux中,如何使用iptables 写⼀条规则?把来源IP为192.168.1.101访问本机80端口的包直接拒绝.

热门文章

最新文章