常用的文件操作接口
发布日期:2021-07-01 04:29:00
浏览次数:2
分类:技术文章
本文共 2632 字,大约阅读时间需要 8 分钟。
文章目录
1 文件描述符和打开模式
1.1 文件描述符
文件描述符fd:
- 是一个>=0的整数。
- 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。
预定义的文件描述符:
- 0:标准输入,对应于已打开的标准输入设备(键盘)
- 1:标准输出,对应于已打开的标准输出设备(控制台)
- 2:标准错误, 对应于已打开的标准错误输出设备(控制台)
多次打开同一个文件,可得到多个不同的文件描述符。
fd本质为特殊的索引,实际上就是进程中file_struct结构体成员fd_array的数组下标。
1.2 文件打开模式
主模式:
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:读写,模式
副模式:
- O_CREAT:当文件不存在,需要去创建文件
- O_APPEND:追加模式
- O_DIRECT:直接IO模式
- O_SYNC:同步模式
- O_NOBLOCK:非阻塞模式
- O_EXCL:如果同时使用O_CREAT而且该文件又已经存在时,则返回错误, 用途:以防止多个进程同时创建同一个文件
- O_TRUNC:若文件存在,则长度被截为0,属性不变
2 open
头文件:
#include#include #include
函数原型:
-
当文件存在时
int open(const char* pathname,int flags)
-
当文件不存在时
int open (const char* pathname,int flags,int perms)
上面的两个函数实际上是使用可变参数。
当其第二个参数含有O_CREAT 时,第三个参数才有效。表示的是当使用open系统调用创建一个文件时,其文件的访问权限是多少,第三个参数可以指定为0755,0644等,也可以用系统提供的宏:S_IRWXU、S_IRUSR等代替,一个作用。
返回值:
- 成功:文件描述符
- 失败:-1
注意:返回的文件描述符是该进程未打开的最小的文件描述符。
3 close
头文件:
#include
函数原型:
int close(int fd)
返回值:
- 成功:0
- 失败:-1
4 read
头文件:
#include
函数原型:
ssize_t read(int fd,void *buff,size_t count) // ssize_t是有符号数
返回值:
成功:
- count:成功读取全部字节
- 0~count:
- 剩余文件长度小于count
- 读取期间被异步信号打断
失败:
- -1,读取错误
5 write
头文件:
#include
函数原型:
ssize_t write(int fd,void *buff,size_t count)
返回值:
成功:
- count:成功写入全部字节
- 0~count:
- 写入期间被异步信号打断
失败:
- -1,读取错误
复制普通文件小实验:
1、打开要复制的文件
2、创建新的文件
3、把源文件内容读到缓冲区,把缓冲区内容写入新文件
4、循坏执行第三步,直到读取的字节数量为0,退出循坏。
5、关闭打开的文件
#include#include #include #include #include int main(int argc, char* argv[]){ int fd1 = -1, fd2 = -1; int read_len = 0; char buffer[512] = { 0}; if (argc != 3) { printf("error usage !\n"); return -1; } fd1 = open(argv[1], O_RDONLY); fd2 = open(argv[2], O_WRONLY | O_CREAT, 0666); if ((fd1 < 0) || (fd2 < 0)) { close(fd1); close(fd2); printf("open file error!\n"); return -1; } while (1) { read_len = read(fd1, buffer, sizeof(buffer)); if (read_len <= 0) { break; } write(fd2, buffer, read_len); } close(fd1); close(fd2); return 0;}
6 lseek
功能:
- 设置文件读写位置
头文件:
#include
函数原型:
off_t lseek(int fd,off_t offset,int whence)
- 若whence为SEEK_SET,基准点为文件开头
- 若whence为SEEK_CUR,基准点为当前位置
- 若whence为SEEK_END,基准点为文件末尾
返回值:
- 成功:文件偏移位置值
- 失败:-1
读写是使用的同一个位置指针。使用O_RDWR时,如果先读了一段再写,那么写的位置从读完处开始,同理先写了一段再读,那么读的位置从写完处开始。可以使用lseek来改变文件位置指针,即读写的位置。
7 sync
功能:
- 页缓存和回写,强制把修改过的页缓存区数据写入磁盘。
头文件:
#include
函数原型:
void sync(void);
返回值:
- 无
8 标准IO函数
由于系统文件IO函数需要在用户态和内核态之间进行切换,所以效率比较低。标准IO则在应用层实现了一个缓冲区,示意图如下:
常见标准IO函数:
-
fopen
-
fclose
-
fread
-
fwrite
-
fseek
-
fflush:强制把IO缓存区的数据写入到页缓存区
文件IO五大模式:
- 阻塞模式
- 非阻塞模式
- IO多路复用
- 异步IO
- 信号驱动IO
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/107681560 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月30日 14时09分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Chrome 59 支持 Headless 模式啦!
2021-07-07
关于架构 - pyspider中文文档 - pyspider中文网
2021-07-07
如何从 WEB 页面中提取信息 | Binuxの杂货铺
2021-07-07
ZEIT – Next.js
2019-05-04
Segment Open
2019-05-04
无需图形界面环境下的浏览器项目一览表 - 开源中国社区
2019-05-04
WebDAV - Wikipedia
2019-05-04
招牌老鸭汤(图)-张生记(双菱店)-杭州-大众点评网
2019-05-04
virtualbox 在物理机是无线网卡的时候做桥接配置 - juandx - 博客园
2019-05-04
Underscore.js与nodejs相结合 - 简单就是美 - ITeye技术网站
2019-05-04
Chrome 远程调试协议分析与实战 | IT瘾
2019-05-04
2017,我们来聊聊 Node.js - CNode技术社区
2019-05-04