APUE读书笔记——文件IO

一、五个函数:

open/read/write/lseek/close

二、文件描述符

对内核而言,每个打开文件都是通过文件描述符(其实就是一个非负整数)引用。惯例0标准输入、1标准输出、2标准出错

三、open函数

打开或者创建文件

#include<fcntl.h>

int open(const char *pathname, int oflag, …/*mode_t mode*/)

返回值:成功返回文件描述符,出错返回-1;返回的一定是最小未用的描述符

oflag:O_RDONLY      O_WRONLY      O_RDWR

可选:O_APPEND;O_CREAT; O_EXCL; O_TRUNC; O_NOCTTY; O_NONBLOCK

四、creat函数

创建文件

#include<fcntl.h>

int creat(const char *pathname, mode_t mode)

返回值:成功返回只写打开的文件描述符,出错返回-1;

等效于open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)

五、close函数

关闭一个打开的文件

#include<unistd.h>

Int close(int filedes)

返回值:成功返回0,出错返回-1

关闭文件时,进程会释放加在该文件上的记录锁

进程结束是会释放掉所有打开的文件

六、lseek函数

每个打开的文件都有一个当前文件偏移量(current file offset)——从文件开始处的字节数

#include<unistd.h>

off_t lseek(int filedes, off_t offset, int whence)

返回值:成功返回新的文件偏移量,出错-1;

whence:SEEK_SET; SEEK_CUR; SEEK_END

(负文件偏移量)

七、read函数

从打开的文件读数据

#include<unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes)

返回值:成功返回读取的字节数,已到文件结尾0,错误-1;

八、write函数

向打开的文件写数据

#include<unistd.h>

ssize_t write(int filedes, const void *buf, size_t nbytes)

返回值:成功返回已写的字节数,出错-1;

写成功后,文件偏移量增加实际写的字节数。

九、文件共享

对于已经打开的文件,内核有三种数据结构表示它:

每个进程都有个进程表项

(1)      文件描述符表

文件描述符标志

指向文件表项的指针

(2)      文件表项

文件状态标志

当前文件偏移量

指向v结点的指针

(3)      v结点

打开文件的内核结构

        

                   两个独立进程打开同一个文件

每个给定文件只有一个v结点表项,而每个进程都有自己的文件表项:这种安排使每个进程都可以有自己对该文件的当前文件偏移量

十、原子操作

多个进程读同一个文件都能正确工作,但是同时写一个文件就会出现意想不到的结果,因为每个进程都有自己的文件表项,里面存有自己的当前文件偏移量。为了避免这种情况,就需要原子操作。

#include<unistd.h>

ssize_t pread(intfiledes, void *buf, size_t nbytes, off_t offset)

返回值:成功返回读到的字节书,到文件末尾0,出错-1;

ssize_t pwrite(intfiledes, void *buf, size_t nbytes, off_t offset)

返回值:成功返回写的字节数,出错-1;

十一、dup和dup2函数

                   复制一个现存的文件描述符

                   #include<unistd.h>

                   int dup(int filedes)

                   int dup2(int filedes, intfiledes2)

                   返回值:成功返回新的文件描述符,出错-1;

dup返回的一定是当前可用的最小的文件描述符,dup2是用filedes2指定新的文件描述符,如果filedes2已经打开,则先将其关闭。

十二、sync、fsync、fdatasync函数

                   为了保证磁盘上实际文件系统与缓冲区高速缓存中的内容一致性

十三、fcntl函数

                   改变已打开文件的性质

                   #include<fcntl.h>

                   int fcntl(int filedes, intcmd, …/*int arg*/)

                   fcntl5种功能:

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值