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