文件IO
1.系统调用
Linux操作系统分为内核层和应用层,他们之间是相互隔离的,也就是说内核层不能直接访问用户层,用户层也不能直接访问内核层
应用层运行用户使用的所有引用程序和服务
内核层管理着系统所有的硬件和资源
虽然内核层和应用层相互独立,但是应用程序在完成各项操作需要使用内核的提供的功能,所以内核层和应用层之间需要一个沟通的桥梁
这个桥梁在Linux称之为系统调用,本质上来说系统调用就是一个函数
通过调用系统调用能够让应用程序访问内核的某些功能
2.文件IO介绍
由于文件保存在磁盘设备上,磁盘设备属于内核管理,所以访问文件需要进入内核,文件IO就是Linux内核提供给用户空间访问文件的接口,因此文件IO属于系统调用
Linux中的C标准IO函数底层调用文件IO的系统调用来实现的,标准IO在文件IO的基础上,添加了缓冲区等内容,提高访问效率
3.文件描述符
标准IO中使用文件流(FILE *)代表一个打开的文件,文件IO使用文件描述符来代表一个打开的文件,文件描述符本质上是一个非负整数,文件描述符本省不存储任何文件信息
文件的信息存在文件表中,文件描述符对应文件表,Linux系统一个进程打开文件描述符个数是有限的(默认是1024个),文件描述符从0开始计算,其中0 1 2已经被系统占用,分别代表标准输入 标准输出 错误输出,这三个描述符在程序启动时就已经打开
文件流 文件描述符
标准输入 stdin 0
标准输出 stdout 1
错误输出 stderr 2
文件描述符是从小到大分配,可以重复使用
4.文件的打开和关闭
open/close
参数:
pathname:要打开文件的路径
flags:打开标志
O_RDONLY/O_WRONLY/O_RDWR:只读/只写/读写 方式打开,必选,只能选一个
O_CREAT:创建标志,存在就打开,不存在就创建
O_EXCL:和O_CREAT联用,不存在新建,存在报错
O_APPEND:追加标志,表示从文件末尾开始操作
O_TRUNC:截断标志,清空文件内容
O_NOCTTY:如果打开的是终端,不将终端作为控制终端
O_NONBLOCK:以非阻塞的方式打开
注:多个标志之间用|连接
mode:权限参数,创建文件时使用,是一个三位8进制数字(会去掉权限屏蔽字屏蔽的权限)
返回值:
成功返回一个新的文件描述符,失败返回-1