APUE-3-文件IO
2023-06-26 11:25:44 3 举报
AI智能生成
unix环境高级编程第3章读书笔记
作者其他创作
大纲/内容
open
read
write
lseek
close
IO函数
不带缓冲的IO
原子操作
引言
非负整数
内核通过文件描述符引用打开的文件
STDIN_FILENO
0-标准输入
STDOUT_FILENO
1-标准输出
STDERR_FILENO
2-标准错误
UNIX系统shell惯例
变化范围:0~OPEN_MAX-1
文件描述符
功能:打开或创建一个文件
打开或创建的文件名
const char *path
一个或多个常量进行“或”运算,详见P50
int oflag
文件访问权限
mode_t mode
path绝对路径,fd忽略
path相对路径,fd开始地址
path相对路径,fd特殊值AT_FDCWD
int fd
参数
time of check to time of use(TOCTTOU)错误
文件名和路径名截断问题
考虑问题
函数open和openat
不足:以只写方式打开所创建的文件
函数creat
关闭一个打开文件
关闭文件时会释放该进程加在该文件上的所有记录锁
进程终止时,内核自动关闭它所有的打开文件
函数close
度量从文件开始处计算的字节数
“当前文件偏移量”
可以调用lseek显式地为一个打开的文件设置偏移量
off_t offset
设置为距文件开始处offset个字节
SEEK_SET
设置为当前值加offset,offset可正可负
SEEK_CUR
设置为文件长度加offset,offset可正可负
SEEK_END
int whence
可用lseek测试是否可设置偏移量
文件偏移量可大于文件当前长度,此时写入将在文件中构成空洞
off_t类型在不同平台的字节数
函数lseek
read成功返回实际读到的字节数,已到达文件尾端则返回0
详见P57
读到字节数少于要求读的字节数的几种情况
与历史原型的变化
函数read
返回值通常与参数nbytes值相同,否则表示出错
函数write
shell重定向IO
不同BUFFSIZE对IO读写的影响
IO的效率
UNIX系统支持在不同进程间共享打开文件
文件描述符标志
指向文件表项的指针
进程打开文件的文件描述符表
文件状态标志
当前文件偏移量
指向该文件V节点表项的指针
所有打开文件的文件表
文件类型
操作函数指针
i节点
每个打开文件都有一个V节点结构
内核用于IO的数据结构
两个独立进程各自打开同一个文件关联在相同的V节点上
文件共享
由两个进程同时追加写同一个文件引出原子操作场景
不更新当前文件偏移量
函数pread和pwrite是SUS的XSI扩展接口,允许原子性地定位并执行IO
创建文件的原子操作场景
原子操作要么执行完所有步骤,要么一步也不执行
复制一个现有文件描述符
返回的新fd一定是当前可用fd最小值
返回的新fd与参数fd共享同一个文件表项
dup函数等效于fcntl函数+F_DUPFD
函数dup和dup2
延迟写:传统UNIX系统由内核复制到缓冲区,稍后写入磁盘
所有修改的块缓冲区排入写队列,然后返回,不等实际写磁盘操作结束
sync
等待写磁盘操作结束才返回
fsync
类似于fsync,只影响数据部分
fdatasync
函数sync、fsync和fdatasync
可以改变已经打开文件的属性
复制一个已有的描述符
获取/设置文件描述符标志
获取/设置文件状态标志
获取/设置异步IO所有权
获取/设置记录锁
5种功能
实例演示获得对应fd的文件状态标志
实例演示修改文件状态标志先要获得当前文件状态标志
函数fcntl
io操作的“杂物箱”
除函数本身所要求的头文件,还要求另外的设备专用头文件
函数ioctl
打开/dev/fd/n等效于dup(n)
解决了程序能用处理其他路径名相同的方式处理标准输入输出
/dev/fd
不同IO长度对读文件所需时间的影响
已写入数据冲洗到磁盘上的方法及其对应用程序性能的影响
说明了UNIX系统提供的基本IO函数
多个进程对同一文件追加写
多个进程创建同一文件
内核用来共享打开文件信息的数据结构
ioctl和fcntl函数
小结
文件IO
收藏
收藏
0 条评论
回复 删除
下一页