【APUE】高级IO
非 阻塞IO
系统调用分为两类:“低速”系统调用和其他,低速系统调用可能会使进程永远阻塞:
- 如果某些文件类型(读管道、终端设备、网络设备)的数据不存在,则读操作可能会使调用者永远阻塞
- 如果数据不能被相同的文件类型立即接受(管道中无空间、网络流控制),写操作可能会使调用者永远阻塞
- 在某种条件发生之前打开某种文件类型可能会发生阻塞(如 要打开一个终端设备,需要等待与之连接的调制解调器应答)
- 对已经加上强制性 记录锁的文件进行读写
- 某些ioctl操作
- 某些进程间通信函数
不能讲与磁盘I/O有关的操作视为低速系统调用
记录锁
功能: 当第一个进程正在读或修改这个文件的某个部分时,使用记录锁可以阻止其他进程修改同一文件区
- flock: 只能对整个文件加锁
- fcntl:支持记录锁功能
- lockf: 基于fcntl提供了一个简化的接口
记录锁的自动继承和释放
- 锁与进程和文件两者相关联:1)当一个进程终止时,它所建立的锁全部释放;2)无论一个描述符何时关闭,该进程通过这一描述符引用的文件上的任何一把锁都会释放
- 由fork产生的子进程不继承父进程设置的锁
- 在执行exec后新程序可以继承原执行程序的锁,但是如果对一个文件描述符设置了执行时关闭标志,那么当作为exec的一部分关闭该文件描述符时,将释放相应文件的所有锁
I/O多路转接
- select
- pselect
- pool
异步I/O
存储映射I/O
将磁盘文件映射到存储空间的一个缓冲区上,从缓冲区中读数据就相当于是读文件中的相应字节
实现 mmap 函数
- 映射文件的 起始偏移量必须是系统虚拟存储页长度的整数倍,
- mmap不能将数据添加到文件中,必须要先加长该文件