【Linux篇】基础IO - 文件描述符的引入
📌 个人主页: 孙同学_
🔧 文章专栏:Liunx
💡 关注我,分享经验,助你少走弯路!
文章目录
- 一. 理解文件
- 1.1 侠义理解
- 1.2 广义理解
- 1.3 文件操作的归类认知
- 1.4 系统角度
- 二. 回顾C语言文件接口
- 2.1 打开文件
- 2.2 对文件进行写入
- 2.3 输出信息到显示器,有哪些方法
- 2.4 stdin & stdout & stderr
- 2.5 打开文件的方式
- 三. 系统文件I/O
- 3.1 位图传递标志位
- 3.2 open
- 3.3 write
- 3.4 read
- 四. 访问文件的本质
- 4.1 文件描述符
一. 理解文件
我们以前就说过 文件 = 文件内容 + 文件属性
1.1 侠义理解
- 文件是在磁盘上的,磁盘本质上是个外设,我们访问文件其实就是在系统和磁盘上进行IO
- 磁盘是永久性的存储介质,文件在磁盘上的存储是永久性的
- 对文件的所有操作,本质上是对外设的输入输出 简称 IO
1.2 广义理解
Linux
下一切皆文件(键盘,显示器,网卡,磁盘… )
1.3 文件操作的归类认知
- 对于0KB的空文件,是占据磁盘的空间的
- 文件 = 文件内容 + 文件属性
- 所有对文件的操作本质上是对文件内容和文件属性的操作
1.4 系统角度
- 对文件的操作本质上是进程对文件的操作
- 磁盘的管理者是操作系统
- 文件的读或写本质上不是通过
C语言/C++
的库函数来操作的(这些库函数只是为用户提供方便),而是通过文件相关的系统调用接口实现的
文件
- “内存级(被打开)”文件
- 磁盘级文件
二. 回顾C语言文件接口
2.1 打开文件
// 文件打开接口
FILE *fopen(const char *path, const char *mode);
path
:表示要打开文件的路径,或者文件名,只有文件名而没有路径表示打开当前路径下的文件。mode
:表示打开的方式,比如只读r
,只写w
,追加a
等。
📌 Tips: 我们之前介绍的重定向,>
本质上就对应使用的是w
选项,>>
本质上就对应使用的是a
选项。
2.2 对文件进行写入
#include
int main()
{
FILE* fp = fopen("myfile.txt","w");
if (fp == NULL)
{
perror("fopen");
return 1;
}
while (1);
fclose(fp);
return 0;
}
打开的myfile
文件在哪个路径下呢?
- 在程序的当前路径下
- 那系统怎么知道程序的当前路径在哪里呢?
可以使用ls /proc/[进程id] -l
命令查看当前正在运行进程的信息:
cwd
:进程当前的工作路径exe
:指向启动当前进程的可执行文件(完整路径)的符号链接。
2.3 输出信息到显示器,有哪些方法
printf()
fprintf()
fwrite()
当我们向显示器打印本质上就是向显示器文件写入,Linux
下一切皆文件
2.4 stdin & stdout & stderr
- c语言会默认打开三个输入输出流,分别是
stdin
,stdout
,stderr
- 这三个流的类型都是
FILE*
为什么要帮我们把这几个流自动打开呢?
我们传统上写的程序是做数据处理的
2.5 打开文件的方式
- 以
w
的方式打开文件时,文件首先会被清空,然后从0开始写
- 我们以前说过的重定向,比如
echo aaaaa > log.txt
,把打印到显示器上的内容写入文件里,前提是我们先得把文件打开。我们的输出重定向>log.txt
为什么会把文件内容清空呢?因为我们输出重定向第一步要打开文件,而打开文件,而打开文件第一步先要把文件清空
- 以
a
的方式打开文件,这种方式叫做追加,它一般写的时候会向文件结尾进行写入,不存在的话就创建它。>>
叫做追加重定向,以a
的方式进行写入本质上也是先要把文件打开,然后再进行写入。
- 当我们向文件里写入一段字符串时,我们需不需要在字符串后面加