函数open和openat
功能:打开或创建一个文件
参数
const char *path
打开或创建的文件名
int oflag
一个或多个常量进行“或”运算,详见P50
int fd
path绝对路径,fd忽略
path相对路径,fd开始地址
path相对路径,fd特殊值AT_FDCWD
考虑问题
time of check to time of use(TOCTTOU)错误
文件名和路径名截断问题
函数creat
等效于open(path ,O_WRONLY|O_CREAT|O_TRUNC, mode)
不足:以只写方式打开所创建的文件
函数lseek
“当前文件偏移量”
非负整数
度量从文件开始处计算的字节数
可以调用lseek显式地为一个打开的文件设置偏移量
参数
int fd
off_t offset
int whence
SEEK_SET
设置为距文件开始处offset个字节
SEEK_CUR
设置为当前值加offset,offset可正可负
SEEK_END
设置为文件长度加offset,offset可正可负
可用lseek测试是否可设置偏移量
文件偏移量可大于文件当前长度,此时写入将在文件中构成空洞
off_t类型在不同平台的字节数
函数read
read成功返回实际读到的字节数,已到达文件尾端则返回0
读到字节数少于要求读的字节数的几种情况
详见P57
与历史原型的变化
文件共享
UNIX系统支持在不同进程间共享打开文件
内核用于IO的数据结构
进程打开文件的文件描述符表
文件描述符标志
指向文件表项的指针
所有打开文件的文件表
文件状态标志
当前文件偏移量
指向该文件V节点表项的指针
每个打开文件都有一个V节点结构
文件类型
操作函数指针
i节点
两个独立进程各自打开同一个文件关联在相同的V节点上
原子操作
由两个进程同时追加写同一个文件引出原子操作场景
函数pread和pwrite是SUS的XSI扩展接口,允许原子性地定位并执行IO
不更新当前文件偏移量
创建文件的原子操作场景
原子操作要么执行完所有步骤,要么一步也不执行
函数sync、fsync和fdatasync
延迟写:传统UNIX系统由内核复制到缓冲区,稍后写入磁盘
sync
所有修改的块缓冲区排入写队列,然后返回,不等实际写磁盘操作结束
fdatasync
类似于fsync,只影响数据部分
函数ioctl
io操作的“杂物箱”
除函数本身所要求的头文件,还要求另外的设备专用头文件
/dev/fd
打开/dev/fd/n等效于dup(n)
解决了程序能用处理其他路径名相同的方式处理标准输入输出
小结
说明了UNIX系统提供的基本IO函数
不同IO长度对读文件所需时间的影响
已写入数据冲洗到磁盘上的方法及其对应用程序性能的影响
原子操作
多个进程对同一文件追加写
多个进程创建同一文件
内核用来共享打开文件信息的数据结构
ioctl和fcntl函数