Linux内核:屏蔽硬件区别,把所有的硬件设备抽象成文件,提供统一的接口给用户使用。
目录
虚拟文件系统:抽象层,对文件的访问实际上是对抽象层的访问。
普通文件系统:ext4、fat32、ubifs
特殊文件系统
文件IO五大模式:阻塞模式、非阻塞模式、IO多路复用、异步IO、信号驱动IO。
系统IO和标准IO
系统IO编程
open函数
close函数
read函数
write函数
lseek函数:设置文件读写位置
sync函数:页缓存和回写,强制把修改过的页缓存区数据写入磁盘
标准IO编程
虚拟文件系统:抽象层,对文件的访问实际上是对抽象层的访问。
抽象对象:封装了底层读写细节,使用c语言的多态来实现具体文件系统的接口。
普通文件系统:ext4、fat32、ubifs
特殊文件系统
进程文件系统:procfs,挂载在/proc,存放进程相关信息,任务管理器。
设备文件系统:devfs,挂载在/dev。存放硬件操作接口。
文件IO五大模式:阻塞模式、非阻塞模式、IO多路复用、异步IO、信号驱动IO。
系统IO和标准IO
系统IO编程
int fd; //定义文件描述符
fd=open(filename,flags,mode); //open(文件名,模式,权限(可选))
lseek(fd,offset,whence); //lseek(文件描述符,读写位置的偏移量,文件读写位置的基准值)
write(fd,buf,write_len);
read(fd,buf,read_len);
close(fd);
主模式(互斥,只选其一) | 描述 | 副模式(兼容,可多选) | 描述 |
O_RDONLY | 只读模式 | O_CREAT | 当文件不存在,需要去创建文件 |
O_WRONLY | 只写模式 | O_APPEND | 追加模式 |
O_RDWR | 读写模式 | O_DIRECT | 直接IO模式,读写数据跳过页缓存区,直接在磁盘操作 |
O_SYNC | 同步模式,不需要手动添加sunc函数 | ||
O_NOBLOCK | 非阻塞模式 |
open函数
//所需头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//函数原型
int open(const char* pathname,int flags); //当文件存在时
int open(const char* pathname,int flags,int perms); //当文件不存在时
//返回值
成功:文件描述符
失败:-1
close函数
//所需头文件
#include <unistd.h>
//函数原型
int close(int fd);
//返回值
成功:0
失败:-1
read函数
//所需头文件
#include <unistd.h>
//函数原型
ssize_t read(int fd,void *buff,size_t count);
//返回值
成功:
count:成功读取全部字节
0~count:
剩余文件长度小于count
读取期间被异步信号打断
失败:-1,读取错误
write函数
//所需头文件
#include <unistd.h>
//函数原型
ssize_t write(int fd,void *buff,size_t count);
//返回值
成功:
count:成功写入全部字节
0~count:写入期间被异步信号打断
失败:-1,写入错误
lseek函数:设置文件读写位置
whence | 描述 |
SEEK_SET | 基准点为文件开头 |
SEEK_CUR | 基准点为当前位置 |
SEEK_END | 基准点为文件末尾 |
//所需头文件
#include <unistd.h>
//函数原型
off_t lseek(int fd,off_t offset,int whence);
//返回值
成功:文件偏移位置值
失败:-1
sync函数:页缓存和回写,强制把修改过的页缓存区数据写入磁盘
//所需头文件
#include <unistd.h>
//函数原型
void sync(void);
//返回值
无
标准IO编程
C标准库实现了一个IO缓存区。
常见标准IO函数(跟上述系统IO函数使用差不多):
fopen
fclose
fread
fwrite
fseek
fflush:强制把IO缓存区的数据写入到页缓存区