在Linux系统中,一切皆文件
读取文件,获取的是文件中的内容;
运行程序,其实是把获取文件中的代码,加载到内存中,然后创建一个进程来运行代码(.exe就是对应的代码加载器)
上面所说的,都离不开 一个概念“文件读取”
目录
一、OS的管理框架
文件存在于磁盘(硬件设备)上,我们通过C/C++读取到文件,并不是我们想象中的直接读取
问:能否直接操作磁盘读取文件吗??
答:不可以!如果经由C/C++直接操作,可能会擅自修改磁盘中的其他内容
操作系统不相信任何人
二、C/C++读取文件的过程
既然无法直接读取,那只能按照流程来
C语言提供的 fopen函数,C++提供的 ofstream,都属于上层接口
open函数,属于系统接口,上层接口会去 调用系统接口 进入OS
我们这里仅关注 上层接口的调用 以及 系统接口的调用
1、上层接口的调用
我们以C语言提供的接口 fopen函数为例
w:以覆盖写的方式打开
a:以追加写的方式打开
这些在其他博客中详细介绍,先来看看效果
2、系统接口的调用
话不多说,我们先实际调用一下看看
(1)open函数的参数
系统接口是open函数,首先看看调用系统接口需要哪些参数
第一个参数:需要读取的文件所在路径
第二个参数:标志位(以读/写的方式打开文件)
第三个参数:权限设置
(2)参数说明
这里主要说明第二个和第三个参数
第二个参数是标志位,告诉open函数是要以读还是以写的方式打开文件,第二个参数必须包含O_RDONLY, O_WRONLY, 以及 O_RDWR 中的一个。
- O_WRONLY:以写的方式打开文件
- O_RDONLY:以读的方式打开文件
- O_WRONLY:以读写的方式打开文件
在此基础上可以附加其他参数
- O_CREAT:当文件不存在时,创建文件
- O_APPEND:在文件末尾追加
问:那为什么参数是int类型的呢??
答:32位下有 32个bit位,我们以低8位为例
假设倒数第一位表示以写的方式打开: 0000 0001
假设倒数第二位表示以读的方式打开: 0000 0010
假设倒数第三位表示文件不存在时创建文件: 0000 0100
问:为什么不用1、2、3、4,而是用这种方式表示呢?
答:这样的话就可以输入多组方式
假设我们希望以写的方式打开,同时当文件不存在时创建文件
那我们使用或运算 0000 0001
0000 0100
--------------------------
0000 0101
这样就能同时输入两种方式了
第三个参数是文件权限设置
Linux中每一个文件被创建出来都自带权限,分别表示用户权限、组权限、其他权限
第三个参数就是设置权限,示例给的 0644 是 8进制 (6 表示011,对应上面的 -rw)
(3)返回值:文件描述符
打开/创建不同的文件,文件描述符不同,设置对应的文件描述符方便OS管理各种文件
下面打开了五个不同的文件,所以会被分配五个不同的文件描述符
问:为什么文件描述符是从 3 开始的??
答:C在运行程序之前,会自动打开三个输入输出流,分别是stdin、stdout、stderr
stdin:标准输入,对应的外设是键盘 fd:0
stdout:标准输出,对应的外设是显示器 fd:1
stderr:标准错误,对应的外设是显示器 fd:2
在Linux中上述三种输入输出流,都是以文件的形式存在的!!
知道了文件描述符的用途,关于文件描述符是什么并非本次的重点,详情可参考下面的博客