文章目录
Unix标准为程序员提供了一系列的通用IO(无缓冲IO)接口以实现文件读写操作,原书第三章主要所涉及到的系统接口主要针对普通文件为操作目标。通用IO相比于标准IO的最大的区别在于没有缓冲机制,只要调用一次标准IO,就进行IO,而不是像标准IO一样具有缓冲的特点,通用IO的可移植性稍逊色于标准IO (Unix和Windows各有其通用IO接口,但标准IO接口一致)
在开始介绍这些系统接口之前,需要先了解一下Unix环境中对于打开的文件是如何管理的
文件共享
Unix中支持多个进程共享同一个文件,也就是说2个独立的进程打开同一份文件互不影响(在不加文件锁的情况下),但是这仅限于打开文件,对于文件的读写是会有一定的影响的。Unix对打开的文件通过如下三种内核数据结构实现管理。
- 文件描述符表:每一个进程都会维护一张私有的文件描述符表,文件描述符表中记录了进程已经打开的文件,每一个表项由文件描述符标识和文件指针构成,其中文件指针指向内核文件表项
- 文件表项:文件表项是内核为维护每一个进程打开的文件所对应的文件状态信息而定义的一个结构,每一个文件表项由文件状态标识、当前偏移量、v节点指针,文件状态标识保存了对应进程对文件的读写权限信息,偏移量保存对应进程在文件中的’‘光标’'位置
- v节点: v节点是真正意义上的已打开文件的唯一标识,v节点是文件打开时从磁盘读入内存的,其中最重要的信息就是i节点,i节点保存了文件的各种属性信息,包括文件的磁盘地址 (Linux直接用i节点替代v节点)
多进程打开同一份文件时,文件描述符表各个进程独有一份,文件表项与进程一一对应,但是v节点全局只有一份;文件表项与v节点是多对一的关系
系统API
open / openat /close
- open打开相应文件并返回对应文件描述符,通过cmd参数设置打开方式,不定参数用于当cmd中含O_CREAT时新文件的初始权限
- openat用于在指定的目录下打开文件,其余参数与open类似,openat可以改变目标文件的相对路径(open中如果使用相对路径只能时当前路径或上一级路径),在使用openat之前必须使用open打开一个目录文件获得其文件描述符
- close关闭打开的文件
== 下述给出常见的文件打开方式
- 只读 O_RDONLY
- 只写 O_WRONLY
- 读写 O_RDWR
- 不存在则创建 O_CREAT
- 追加 O_APPEND
- 打开目录 O_DIRECTORY
- 重写 O_TRUNC
通过按位或实现多个打开方式的整合,但请不要把冲突的打开方式一起设置(不能只读且只写),更详细的打开方式宏可以参见附录 ==
eg:
#define pi(x) printf("%ld\n",(long int)x)
int fd=open("file",O_CREAT|O_RDWR,0666);
//file以工