文件操作——系统调用函数open函数(含文件描述符介绍)

在Linux系统中,一切皆文件

读取文件,获取的是文件中的内容;

运行程序,其实是把获取文件中的代码,加载到内存中,然后创建一个进程来运行代码(.exe就是对应的代码加载器)

上面所说的,都离不开 一个概念“文件读取


目录

一、OS的管理框架

二、C/C++读取文件的过程

1、上层接口的调用

2、系统接口的调用

(1)open函数的参数

(2)参数说明

(3)返回值:文件描述符


一、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中上述三种输入输出流,都是以文件的形式存在的!!

知道了文件描述符的用途,关于文件描述符是什么并非本次的重点,详情可参考下面的博客

OS管理文件的方式(文件读写的过程)_abs(ln(1+NaN))的博客-CSDN博客https://blog.csdn.net/challenglistic/article/details/123940013?spm=1001.2014.3001.5501

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值