Linux系统编程--第三章 缓冲输入输出

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缓冲区复制到本地内存,存在两个副本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值