1、用户缓冲IO:在用户空间实现的缓冲区,用于将程序的多次轻量级的IO请求组合起来,提高操作效率。
2、标准IO:属于C语言标准库,因此文件打开,关闭,读写都是通过标准IO库完成的。
3、文件指针:FILE:在C标准库中,不属于内核,实际上映射到内核的文件描述符
4、文件操作:
一下提到的缓冲区是由C标准库维持的,区别于内核的缓冲区。不执行系统调用,多次轻量级的访问合并,再执行系统调用。
#include <stdio.h>
FILE* fopen(const char * path, const char * mode);
FILE* fdopen (int fd, const char *mode);
int fclose (FILE *stream);
int fcloseall (void);
int fgetc (FILE *stream);/*读取单个字节,并强制转换为int类型*/
int ungetc (int c, FILE *stream);/*将c转换为字符写入流中,成功返回c*/
char * fgets (char *str, int size, FILE *stream);/*按行读取,读取size-1个字节,末尾加\n*/
int fputc (int c, FILE *stream);
int fputs (const char *str, FILE *stream);
size_t fread (void *buf, size_t size, size_t nr, FILE *stream);/*读取复杂的二进制数据*/
size_t fwrite (void *buf, size_t size, size_t nr, FILE *stream);
/*
因为变量大小、对齐、填充、字节序的不同,一个程序写的二进制文件,对另一个程序可能是不能读的,即使是同一程序,在不同的处理器上,读取也是不一样的,只有在特定ABI的机器上才能保证
*/
/*定位流,标准IO提供了一些等价于系统调用lseek()的函数*/
int fseek (FILE *stream, long offset, int whence);/*whence : SEEK_SET、SEEK_CUR、SEEK_END*/
int fsetpos (FILE *stream, fpos_t *pos);/*等价于fseek时whence等于SEEK_SET*/
void rewind (FILE *stream); 等价于int fseek (FILE *stream, 0, SEEK_SET);
//获取当前流位置
int fgetpos (FILE *stream, fpos_t *pos);
//清洗一个流
int fflush (FILE *stream);/*调用该函数的时候,stream流指向的所有未写入的数据会被清洗到内核缓冲中。更多的是调用fflush后立即调用fsync,同步写入磁盘*/
//获取相关联的文件描述符
int fileno (FILE *stream);//在使用文件描述符读写之前,应该先冲洗该流的内容
5、控制缓冲
缓冲方式:不缓冲,行缓冲(标准输出的默认方式)、块缓冲(文件的默认方式)
int setvbuf (FILE *stream, char *buf, int mode, size_t size);
/*_IONBF无缓冲 _IOLBF行缓冲 _IOFBF块缓冲*/
6、线程安全。标准IO函数本质上是线程安全的。提议使用锁来对文件流实现所有者线程的安全访问。
7、标准IO缺点:需要复制两次,先从内核缓存复制到IO缓冲区,再从IO缓冲区复制到本地内存,存在两个副本。