02.文件IO

文件描述符

表述打开的文件的

它是open函数的返回值,一个进程启动之后,会默认打开3个文件标识符

0标准输入,1标准输出,2标准错误

新的打开的文件返回文件描述符表中未使用过的最小的文件描述符

open函数

用来打开或者新建一个文件

函数原型

int open(const char *pathname, int flags)
int open(const char *pahtname,int flags,mode_t mode)
pathname–>打开或者新建的文件的路径
flags–>文件的访问模式同时可以选择多个,用’ | '连接

必选:O_RDONLY、O_WRONLY、O_RDWR(三选一)

可选:O_APPEND(偏移量到最后)、O_CREAT(文件不存在创建出来,访问权限,有掩码)、O_EXCL(出错返回)

O_TRUNC(如果文件存在,将其长度阶段为0字节)

返回值:

成功返回未被占用的最小的文件描述符

失败则返回-1

open(“a.txt”,O_RDWR | O_CREAT, 0644)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

rwx中的x对于目录而言,是可以进入这个文件
对于文件而言,是表示这个文件是可执行文件

阻塞与非阻塞(O_NONBLOCK)

阻塞发生的前提是有阻塞事件的发生,例如去IO磁盘中的数据,进程会阻塞
但是普通文件读取数据是在内核缓冲区中,不会发生阻塞事件
所以:
普通文件默认是非阻塞的
设备、管道和套接字文件默认是阻塞的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

close函数

函数描述

关闭文件的

函数原型

int close(int fd)

返回值

成功返回0

失败返回-1

read函数、write函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

把a中的文件读取到缓冲区里,然后再把缓冲区的内容放a中,放入的内容为追加

但是把a中的文件读取后放b中,放入的内容为覆盖

这是因为一个文件再被读取之后,会改变它的偏移量到最末尾,所以a中的读取后再写a中属于追加

lseek函数

函数原型

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

函数参数

offset+SEEK_SET–>设置偏移量为offset
offset+SEEK_CUR–>设置偏移量为当前cur+offset
offset+SEEK_END–>负数(end-)整数(扩容)

返回值

成功返回新的偏移量
失败返回-1

常用

lseek(fd,0,SEEK_SET);
int len=lseek(fd,0,SEEK_CUR);
int len=lseek(fd,0,SEEK_END);
lseek(fd,n,SEEK_END);(扩展后需要执行一次写操作才能操作成功)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

面试

1.知道为什么有这个知识点

2.知道知识点的使用场景

3.背一个知识点可以从它的名字开始

系统调用

系统调用是进入内核态的入口,只有在内核态的时候才能管理硬件资源

索引

名字:–>搜索+下标

索引是用来快速查找数据的一种数据结构 (类比字典和目录)

二叉搜索树(不平衡,可以退化成链表O(n)查找)–>平衡二叉树(层数高,磁盘IO读取多)–>B树(多叉树)–>B+树(数据都在叶子结点的多叉平衡树)

事务

交易要么成功要么失败

fcntl函数

用来获取或修改文件访问权限(状态)flags的函数

获取flags(访问权限)

int flags=fcntl(int fd,F_GETFL);

修改flags

fcntl(int fd,F_SETFL,flags)
失败返回-1并且设置errno值
#include<stdio.h>
#include<string.h>                                                              
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc, char* argv[]){
	int fd=open("a.txt",O_RDONLY | O_CREAT |O_NONBLOCK,0644);
	int flags=fcntl(fd,F_GETFL);
	//保留末2位,因为只读只写 可读可写 没有超过3的数据所以都用&3保留后俩位
	if((flags & O_ACCMODE) == O_RDONLY){
		printf("文件可读\n");
	}
	return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dup函数

复制文件描述符,返回新的文件描述符,使新的fd和旧的fd指向同一打开的文件
int new_fd=dup(old_fd);

用open打开同一文件两次,fd1和fd2指向的是不同的打开文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fd2覆盖了fd1的内容,因为fd维护文件偏移量,fd指向不同文件写入不会改变文件偏移量

但是用dup函数复制文件描述符,复制的fd和原fd指向同一打开文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dup2函数

int new_fd2=dup2(old_fd,new_fd1);
关闭fd1文件,使fd1指向old_fd

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

perror函数

打印errno值相对应的报错信息
perror(const char *s)
在输出报错信息前加一些额外的信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

strerror函数

将错误码转换为相应信息的错误字符串

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

stat函数

获取文件的属性
头文件:#include <sys/stat.h>
int stat(const char* pathname,struct stat *file_info)传出参数
int lstat(const char* pathname,struct stat *file_info)
int fstat(int fd,struct *file_info)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

综合练习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值