APUE 学习笔记(二) 文件I/O

1. 文件I/O

对于内核而言,全部打开的文件都经过文件描述符引用, 内核不区分文本文件和二进制文件
open函数:O_RDONLY  O_WRONLY  O_RDWR
create函数:
close函数:关闭一个文件时还会释放该进程加在该文件上的全部记录锁
lseek函数:显式地为一个打开的文件设置其偏移量
每一个打开的文件都有一个与其相关联的 "当前文件偏移量",用以度量从文件开始处计算的字节数,一般,读、写操做都从当前文件偏移量处开始,并使偏移量增长所读写的字节数
文件偏移量能够大于文件的当前长度,写该文件会在文件中造成一个空洞, 文件中的空洞并不要求在磁盘上占用存储区
 
read函数: 实际读到的字节数少于所要求读的字节数 的状况:
(1) 读普通文件时,在读要求字节数以前已达到了文件尾端,好比到达文件尾端以前还有30字节,而要求读100字节, 那么下一次read会返回30字节,再下一次返回0
(2) 当从终端设备读时,一般一次最多读一行
(3) 当 从网络套字节读时,网络中的缓冲机制可能形成返回值小于所要求读的字节数
(4) 当从管道或FIFO读时,例如 管道包含的字节数少于所需的数量,那么read将只返回实际可用的字节数
(5) 当某一信号形成中断,而已经读了部分数据量时
 
write函数:其返回值要与所写的字节数相同,不然表示出错
 

2.文件共享

内核使用三种数据结构来表示打开的文件
 
(1)每一个进程在进程表中都有一个记录项,包含文件描述符表,有一个文件描述符标志和 指向文件表项的指针
(2)内核为全部打开文件维护一张文件表,包含 文件状态标志、 当前文件偏移量、指向该文件V节点表项的指针
(3)每一个打开文件都有一个v节点结构, Linux使用inode节点结构,记录文件的元信息,对应于fstat函数
 
 
一个给定的文件只有一个v节点表项
每一个进程都有它本身对该文件的当前偏移量
 

3. dup和dup2函数:复制一个现存的文件描述符

函数返回的新描述符与输入参数描述符共享同一个文件表项
 

4.fcntl函数

fcntl函数能够改变已打开的文件的性质
int fcntl(int fd, int cmd, ...)
fcntl函数有5中功能:
(1)复制一个现有的描述符 (cmd = F_DUPFD)
(2)获取/设置文件描述符标记 (cmd = F_GETFD, F_SETFD)
(3)获取/设置文件状态标志 (cmd = F_GETFL, F_SETFL)
(4)获取/设置异步I/O全部权 (cmd = F_GETOWN, F_SETOWN)
(5)获取/设置记录锁 (cmd = F_GETLK, F_SETLK, F_SETLKW)
相关文章
相关标签/搜索