金色的骷髅 发表于 2015-1-18 11:29:03

Linux教程之利用读写缓冲仓酷云

对于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;//缓冲区巨细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++;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也不会都招致内核的写磁盘操纵,只要当内核缓冲区堆集到必定量时才一次写进磁盘,偶然俄然断电,则内核缓冲区的数据会丧失。
当历程请求的数据块不在内核缓冲区时,内核把响应的数据加到哀求数据列表中,然后挂起该历程,为其他历程服务。一段工夫后(很短),内核把响应数据从磁盘读到内核缓冲区,然后再把数据复制到历程缓冲区,最初唤起被挂起的历程。

对于开发环境的选择尽量要轻量级和高度可定制,航空母舰级别的工具往往会让你迷惑不解;

若相依 发表于 2015-1-21 07:46:53

笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机

蒙在股里 发表于 2015-1-25 10:39:57

Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。

愤怒的大鸟 发表于 2015-1-27 12:24:51

为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。?

不帅 发表于 2015-2-3 09:29:13

Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。

飘灵儿 发表于 2015-2-8 20:02:45

这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。

活着的死人 发表于 2015-2-9 23:47:44

把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

只想知道 发表于 2015-2-28 08:49:37

发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。

小女巫 发表于 2015-3-8 18:57:40

永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。

变相怪杰 发表于 2015-3-16 11:43:36

安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。

分手快乐 发表于 2015-3-22 22:16:14

把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
页: [1]
查看完整版本: Linux教程之利用读写缓冲仓酷云