目录
open接口
打开文件的接口,第一个参数是文件名;
第二个参数是宏,系统中用宏来控制这个文件的打开方式(只读、只写、读写)
O_CREAT 文件不存在就创建文件
O_APPEND 追加式写入内容
O_RDONLY 只读
O_WRONLY 只写
O_TRUNC 打开前清空文件
可以传多个宏,用 | 链接
底层用位图实现,一个位为1代表不同的功能
第三个参数是关于权限的;
错误示例:
不能用两个参数的 open 接口来打开一个不存在的文件,没有设置权限,该文件的权限会出现乱码的形式:
当我们打开一个不存在的文件时,需要用到三个参数的接口:
此时的权限是 664 ,并没有按照的给定的标准666来,这是因为权限掩码 0002 的影响,一般的为例权限按照我们的要求来,是需要将掩码设为 0 :
close接口
关闭打开的文件
write接口
向文件中写入内容
第一个参数为 打开文件返回的整型,第二个参数是插入文件内容的起始地址,第三个内容是插入内容的大小:
打开前清空文件内容
C语言中,以w方式打开的文件,在重新写入时,会清空源文件的内容,而 write 接口时在原内容的基础上覆盖式写入:
要使文件写入前将文件内容清空,在open接口上 调用宏 O_TRUNC
追加方式打开文件
调用open时,添加宏 O_APPEND,写入新内容时不会清空文件,直接在已有内容后写入新内容
read 接口
第一个参数是打开文件的返回整形,第二个参数是要将文件内容读入的缓冲区,第三个参数是读入缓冲区的大小
为什么 open 接口返回的值是 3?
多创建几个文件,看看返回值是否一致:
那么0、1、2是什么呢?---标准IO
返回的整数叫做文件描述符,以前 C 语言中 FILE* 指针指向的是一个结构体,里面一定包含了文件描述符来区分文件。
C语言文件操作函数是封装了系统调用的,其返回值 FILE* 结构体也是封装了系统的文件描述符fd的,一一对应的关系。
0:标准输入,键盘
1:标准输出,显示器
2:标准错误,显示器
验证0
默认标准输入键盘是打开的,运行程序后直接输入,观察打印出的值
验证1、2
默认标准输出显示器是打开的,直接打印在显示屏上
默认标准错误显示器是打开的,直接打印在显示屏上
再看看C中标准输入输出和错误中的文件描述符:
进程和文件硬件的联系
返回值0、1、2、3、4……这些其实是数组下标:
在进程打开多个文件时,遵守先描述--再组织的原则:创建指向起始文件的指针,为了方便管理,采用链表形式将文件信息组成的结构体相连,这些结构体包含了各个文件的内核数据结构。
创建PCB,PCB中存储了指向文件结构体的起始指针,指针指向的是一个指针数组,指针数组中存储的就是各个文件的结构体指针,这样文件就跟进程联系到了一起
Linux下一切皆文件,我们通过验证,发现0、1这样的下标代表的是硬件也可以传入系统调用接口中,这就很好的反映了这句话。
那么底层是如何实现的:
先描述在组织,描述时内核创建包含文件信息的结构体,结构体中也含有各种函数指针,指针指向的是调用各个硬件的方法,相当于描述创建的结构体封装了硬件调用的接口,这样就将进程和硬件连接在了一起。