unix/linux编程实践教程------学习笔记(第二章)
来源:互联网 发布:软件项目风险清单 编辑:程序博客网 时间:2024/05/16 09:32
第2.7节 提高文件i/o效率的方法-----使用缓冲
在上一节编写who程序的过程中,我们词用的方法是从UTMP_FILE文件中每次读取sizeof(struct utmp)大小的数据,也就是每次读取一个结构体大小的登录信息。那么这样读取的效率非常低。这一节,我建立一个内存池,每次读取16个结构体大小的数据,这样的话我的程序使用系统调用的次数就变少了很多,有助于提高程序效率。
程序如此
<pre name="code" class="cpp">/* utmplib.c - functions to buffer reads from utmp file * * functions are * utmp_open( filename ) - open file * returns -1 on error * utmp_next( ) - return pointer to next struct * returns NULL on eof * utmp_close() - close file * * reads NRECS per read and then doles them out from the buffer */#include <stdio.h>#include <fcntl.h>#include <sys/types.h>#include <utmp.h>#define NRECS 16#define NULLUT ((struct utmp *)NULL)#define UTSIZE (sizeof(struct utmp))static char utmpbuf[NRECS * UTSIZE]; /* 内存缓冲 */static int num_recs; /* 数据数目 */static int cur_rec; /* 当前数据指针 */static int fd_utmp = -1; /* 保存登录信息文件描述符 */utmp_open( char *filename ){ fd_utmp = open( filename, O_RDONLY ); /* open it */ cur_rec = num_recs = 0; /* no recs yet */ return fd_utmp; /* report */}struct utmp *utmp_next(){ struct utmp *recp; if ( fd_utmp == -1 ) /* error ? */ return NULLUT; if ( cur_rec==num_recs && utmp_reload()==0 ) /* 当cur_rec等于num_recs时,说明当前缓冲区的数据已经读取完毕,&&号后面的函数开始执行,读取下一个缓冲区域的数据 */ return NULLUT; /* get address of next record */ recp = ( struct utmp *) &utmpbuf[cur_rec * UTSIZE]; cur_rec++; return recp;}int utmp_reload()/* * read next bunch of records into buffer */{ int amt_read; /* read them in */ amt_read = read( fd_utmp , utmpbuf, NRECS * UTSIZE ); /* how many did we get? */ num_recs = amt_read/UTSIZE; /*当前读取数据的个数 /* reset pointer */ cur_rec = 0; return num_recs;}utmp_close(){ if ( fd_utmp != -1 ) /* don't close if not */ close( fd_utmp ); /* open */}
0 0
- unix/linux编程实践教程------学习笔记(第二章)
- Unix/Linux编程实践教程参考答案-----第二章学习笔记
- 《unix/linux编程实践教程》学习笔记:第二章 编写who,cp命令
- unix/linux编程实践教程------学习笔记
- 《unix/linux编程实践教程》学习笔记:第九章 shell
- unix/linux编程实践教程------学习笔记(三)
- unix/linux编程实践教程------学习笔记(四)
- unix/linux编程实践教程------学习笔记(五)
- Unix-Linux编程实践教程——第二章
- 《unix/linux编程实践教程》学习笔记:第一章概论
- 《unix/linux编程实践教程》学习笔记:第七章 事件驱动编程:编写一个视频游戏
- Unix/Linux编程实践教程 笔记一
- 《unix/linux编程实践教程》学习笔记:第五章 连接控制:学习stty
- unix/linux编程实践教程:学习stty
- Unix/Linux 编程实践教程 第6章 笔记
- 《unix/linux编程实践教程》学习笔记:第三章 编写ls
- 《unix/linux编程实践教程》学习笔记:第四章 文件系统:编写pwd
- 《unix/linux编程实践教程》学习笔记:第六章 终端控制与信号
- hdu 3308(区间合并)
- ECSHOP添加右侧菜单和权限
- oc学习笔记
- Java编译原理
- [Java Core]Java字符串的代码点和代码单元
- unix/linux编程实践教程------学习笔记(第二章)
- 【SDUTOJ 3309】 乱七八糟的图 (最短路+枚举最短路上的边)
- 给多行公式上色
- mysql前缀索引
- 在Android上实现Java和Js交互
- android自定义桌面挂件widget用法(二)
- socket通信之七:Overlapped I/O 完成例程模型实现的客户/服务器模型
- JAVAEE struts2的简单文件上传与下载
- CSS布局:上中下三栏自适应高度