应用_IO编程
IO编程
1.标准IO :标准c库提供对文件操作的函数接口
行缓冲:1024byte,截止:存满,调用fflush,程序结束,遇到\n (fgetc/fputc fgets/fputs )
全缓冲:4096byte,截止:存满,调用fflush,程序结束 (fread/fwrite)
不缓冲:0byte,系统调用 (fopen/fclose stderr)
清空缓冲条件:
1 缓冲区填满
2 写入的字符中有‘\n’ '\r'
3 调用fflush手动刷新缓冲区
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新
5.进程结束主动调用fflush刷新缓冲区
1. IO缓冲区避免被内核频繁调用陷入内核态(系统调用是软中断),提高内核效率,
串口终端以及网络设备,直接使用系统调用提高实时性
流:操作文件的地址
开 : fopen: FILE *fopen(const char *path, const char *mode)
字:一次读写一个字符。
getchar,fgetc: int fgetc(FILE *stream)
putchar,fputc: fputc(int c, FILE *stream)
代码示例:https://www.cnblogs.com/panda-w/p/11075389.html
行:一次读一行,部分;写一行,部分,多行。
fgets: char *fgets(char *s, int size, FILE *stream)
fputs: int fputs(const char *s, FILE *stream)
代码示例:https://www.cnblogs.com/panda-w/p/11075563.html
块:一次读写多个指定大小的快,或部分。
fread: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
fwrite: size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream)
代码示例:https://www.cnblogs.com/panda-w/p/11075731.html
文件定位 : fseek: int fseek(FILE *stream, long offset, int whence) (控制文件读写位置)
代码示例:https://www.cnblogs.com/panda-w/p/11076064.html
关 : fclose: int fclose(FILE *stream)
<笔记>
2.文件IO :
open: int open(const char *pathname, int flags, mode_t mode) ; open(文件路径, 标志, 权限标志)
打开标志:
操作标志:
权限标志:
read : ssize_t read(int fd, void *buf, size_t count)
lseek: off_t lseek(int fd, off_t offset, int whence) (控制文件读写位置)
offset :为正则向文件末尾移动(向前移)为负数则向文件头部(向后移)
SEEK_SET :从文件头部开始偏移offset个字节。
SEEK_CUR:从文件当前读写的指针位置开始,增加offset个字节的偏移量。
SEEK_END:文件偏移量设置为文件的大小加上偏移量字节。
代码示例:https://www.cnblogs.com/panda-w/p/11078173.html
write: ssize_t write(int fd, const void *buf, size_t count)
close: int close(int fd)
返回值: 成功:0
失败:-1
代码示例:https://www.cnblogs.com/panda-w/p/11076319.html
dup: int dup(int oldfd)
代码示例:
<笔记>
<笔记>
I/O :
阻塞 非阻塞 (同步)
多路复用 异步 (异步)
mmap是把文件和设备映射到内存里面(设备文件到进程空间的映射然后通过函数返回的指针来访问设备文件),用户空间的函数,对内核空间的内存管理产生影响。
mmap 本质就是在当前进程里面申请一个vm_area_struct 的结构体,然后把设备文件映射到虚拟内存区域,最后返回buff指针,通过操作buff来操作设备 ! !!
mmap(效率) :
由于write 调用 copy_to_user
read 调用 copy_from_user
去把用户和内核相互拷贝,产生开销,当数据量很大就会开销很大,影响系统性能。所以使用mmap直接映射到当前进程直接访问 !!
mmap(应用)—>do_mmap(内核)—>先创建新的VMA(内存虚拟区域)结构体初始化,再加入进程虚拟地址空间—>调用驱动mmap,建立用户VMA与驱动内存地址之间映射关系(建立页表)