APUE文件IO

文件描述符
                                        标准输入(STDIN_FILENO)
                                        标准输出(STDOUT_FILENO)
                                        标准出错(STDERR_FILENO)

pag48
int open (const char *pathname, int flag, ...); //打开或创建一个文件
仅当创建一个文件时才使用第三个参数
需要注意的是:
O_RDONLY、O_WRONLY、O_RDWR 三者之中 必须指定只能指定一个
open返回的一定是 最小的未用描述符数值。( 每次调用open都会创建一个新的文件表项,dup,dup2不会

int creat (const char *pathname, mode_t mode);(以只写方式打开创建文件)
等效于
open (pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);(首选)

int close (int filedes);//关闭打开文件
关闭文件时会释放该进程加在该文件上的所有 记录锁。(pag358)

off_t lseek (int filedes, off_t offset, int whence);//显示地为打开文件设置偏移量
文件描述符不能是:管道、FIFO、网络套接字(否则返回-1)
对于普通文件,其偏移量必须是非负值(某些设备可能允许负偏移量),应测试返回值是否等于-1而不是测试是否小于0
文件偏移量可以大于文件当前长度,加长部分形成空洞。空洞不占磁盘空间,但是文件长度和无空洞加长的文件一样。

ssize_t read (inf filedes, void *buf, size_t nbytes);//从打开文件中读取数据
如成功返回读取字节数。
ssize_t write (int filedes, const void *buf, size_t nbytes);//向打开文件写数据
返回值与nbytes相同,否则表示出错。
常见错误原因:
1、磁盘已满
2、超过给定进程的文件长度限制

pag56
内核用三种数据结构表示打开的文件:
1、进程表项
文件描述符标识
指向一个文件表项的指针
2、文件表项
文件状态标识
当前文件偏移量
指向文件v节点表项的指针
3、v节点结构
i节点
当前文件长度
v节点信息

linux没有将相关数据结构分为i节点和v节点,而是采用了一个独立于文件系统的i节点和一个依赖于文件系统的i节点。

原子操作读写函数:
ssize_t pread (int filedes, void *buf, size_t nbytes, off_t offset);
ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);

int dup (int filedes); //复制filedes文件描述符,返回当前可用文件描述符的最小值
int dup2 (int filedes, int filedes2); //filedes2指定新描述符的数值, 如果filedes2已经打开则先将其关闭
新描述符的执行时关闭(close-on-exec)标识总是由dup函数清除。

pag61
延迟写
当将数据写入文件时, 内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲区输出队列,然后待其到达队首时,才进行实际的IO操作。
int fsync (int filedes);//对filedes指定的单一文件起作用,并等待写磁盘操作结束
int fdatasync (int filedes);//类似fsync,但只影响文件数据部分,fsync还更新文件属性
void sync (void);//将所有修改过的块缓冲区排入写队列,并不等待实际写磁盘操作结束

int fcntl (int filedes, int cmd, ...);//改变已打开文件属性
5种功能:
1、复制一个现有的描述符(cmd = F_DUPFD)
2、获得/设置文件描述符标记(cmd = F_GETFD或F_SETFD)
3、获得/设置文件状态标志(cmd = F_GETFL或F_SETFL)O_ACCMODE
4、获得/设置异步IO所有权(cmd = F_GETOWN或F_SETOWN)
5、获得/设置记录锁(cmd = F_GETLK、F_SETLK或F_SETLKW)

修改文件描述符标识或文件状态标志步骤
1、取得现有的标志值
2、根据需要修改它(并)
3、设置新标志值

pag67
int ioctl (int filedes, int request, ...);//IO操作

打开文件/dev/fd/n等效于复制描述符n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值