|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于linux命令,一定要学会用man和info去查他们的解释;
我们渐渐来讲明为何要利用缓冲:
- 只要事情在办理员形式下,即只要内核代码才能够会见磁盘、终端、打印机等设备,还能够会见全体的内存。而用户形式下只会见特定地区的内存空间。
- 体系挪用就是要从用户空间堕入内核空间,进进办理员形式。体系挪用是很花工夫的,缘故原由:(1)实行权从用户代码转移到内核代码自己要举行数据传输;(2)办理员形式对应特别的仓库和内存情况,体系挪用前必需创建好,体系挪用后又要把仓库和内存情况恢复成用户程序运转时的形态,这类切换必要损耗良多工夫。
- read()和write()要会见磁盘,它们是体系挪用,为勤俭工夫应只管削减read()和write()的挪用次数,为到达此目标就要增年夜文件缓冲。
上面的代码是本人完成利用缓冲区的who命令完成。
#include<stdio.h>#include<utmp.h>#include<string.h>#include<stdlib.h>#include<time.h>#include<sys/types.h>#include<fcntl.h>#defineBUFSIZE16//缓冲区中寄存16笔记录#defineNULLUT((structutmp*)NULL)//界说一个空指针,不指向任何实践的对象或函数#defineUTSIZE(sizeof(structutmp))#defineSHOWHOSTintmy_utmp_open(char*filename);structutmp*my_utmp_next();intmy_utmp_reload();voidmy_utmp_close();voidshow_info(structutmp*);staticcharutmpbuf[BUFSIZE*UTSIZE];//缓冲区巨细staticintnum_recs;//缓冲区中的数据个数staticintcur_rec;//缓冲区中已利用的数据个数staticintfd_utmp=-1;//utmp文件的形貌符intmy_utmp_open(char*filename){fd_utmp=open(filename,O_RDONLY);cur_rec=num_recs=0;returnfd_utmp;}structutmp*my_utmp_next(){structutmp*result;if(fd_utmp==-1)//文件翻开失利returnNULLUT;if(cur_rec==num_recs&&my_utmp_reload()==0)//缓冲区已读完,就从文件向缓冲区reload新内容。假如从文件中已读不出更多的内容,则前往空指针returnNULLUT;result=(structutmp*)&utmpbuf[cur_rec*UTSIZE];cur_rec++;returnresult;}intmy_utmp_reload(){intnum=read(fd_utmp,utmpbuf,BUFSIZE*UTSIZE);//最多读取16笔记录num_recs=num/UTSIZE;//实践读取的纪录数cur_rec=0;returnnum_recs;}voidmy_utmp_close(){if(fd_utmp!=-1)close(fd_utmp);}intmain(){structutmp*record;if(my_utmp_open("/var/run/utmp")==-1){//翻开文件perror("fopen");exit(0);}while((record=my_utmp_next())!=NULLUT){//轮回读取纪录(布局体)show_info(record);}my_utmp_close();//封闭文件return0;}voidshow_info(structutmp*buf){if(buf->ut_type!=USER_PROCESS)return;printf("%-8s",buf->ut_name);//输入用户名printf("%-12s",buf->ut_line);//终端设备名time_ttimelong=buf->ut_time;structtm*localnow=localtime(&timelong);printf("%d-%d-%d%d:%d",localnow->tm_year+1990,localnow->tm_mon+1,localnow->tm_mday,localnow->tm_hour,localnow->tm_min);//登录工夫#ifdefSHOWHOSTprintf("(%s)",buf->ut_host);#endifprintf("
");}内核缓冲区
办理员形式和用户形式之间切换必要工夫,比拟之下,磁盘I/O损耗的工夫更多,因而内核也使用缓冲手艺来进步对磁盘的会见速率。
因而read函数并非把数据间接从磁盘读到历程缓冲区,而是从内核缓冲区读到历程缓冲区;一样write也不会都招致内核的写磁盘操纵,只要当内核缓冲区堆集到必定量时才一次写进磁盘,偶然俄然断电,则内核缓冲区的数据会丧失。
当历程请求的数据块不在内核缓冲区时,内核把响应的数据加到哀求数据列表中,然后挂起该历程,为其他历程服务。一段工夫后(很短),内核把响应数据从磁盘读到内核缓冲区,然后再把数据复制到历程缓冲区,最初唤起被挂起的历程。
对于开发环境的选择尽量要轻量级和高度可定制,航空母舰级别的工具往往会让你迷惑不解; |
|