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
原创粉丝点击