仓酷云
标题:
Linux教程之利用读写缓冲仓酷云
[打印本页]
作者:
金色的骷髅
时间:
2015-1-18 11:29
标题:
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))
#defineSHOWHOST
int
my_utmp_open(
char
*filename);
struct
utmp*my_utmp_next();
int
my_utmp_reload();
void
my_utmp_close();
void
show_info(
struct
utmp*);
static
char
utmpbuf[BUFSIZE*UTSIZE];
//缓冲区巨细
static
int
num_recs;
//缓冲区中的数据个数
static
int
cur_rec;
//缓冲区中已利用的数据个数
static
int
fd_utmp=-1;
//utmp文件的形貌符
int
my_utmp_open(
char
*filename){fd_utmp=open(filename,O_RDONLY);cur_rec=num_recs=0;
return
fd_utmp;}
struct
utmp*my_utmp_next(){
struct
utmp*result;
if
(fd_utmp==-1)
//文件翻开失利
return
NULLUT;
if
(cur_rec==num_recs&&my_utmp_reload()==0)
//缓冲区已读完,就从文件向缓冲区reload新内容。假如从文件中已读不出更多的内容,则前往空指针
return
NULLUT;result=(
struct
utmp*)&utmpbuf[cur_rec*UTSIZE];cur_rec++;
return
result;}
int
my_utmp_reload(){
int
num=read(fd_utmp,utmpbuf,BUFSIZE*UTSIZE);
//最多读取16笔记录
num_recs=num/UTSIZE;
//实践读取的纪录数
cur_rec=0;
return
num_recs;}
void
my_utmp_close(){
if
(fd_utmp!=-1)close(fd_utmp);}
int
main(){
struct
utmp*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();
//封闭文件
return
0;}
void
show_info(
struct
utmp*buf){
if
(buf->ut_type!=USER_PROCESS)
return
;
printf
(
"%-8s"
,buf->ut_name);
//输入用户名
printf
(
"%-12s"
,buf->ut_line);
//终端设备名
time_t
timelong=buf->ut_time;
struct
tm
*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);
//登录工夫
#ifdefSHOWHOST
printf
(
"(%s)"
,buf->ut_host);
#endif
printf
(
"
"
);}
内核缓冲区
办理员形式和用户形式之间切换必要工夫,比拟之下,磁盘I/O损耗的工夫更多,因而内核也使用缓冲手艺来进步对磁盘的会见速率。
因而read函数并非把数据间接从磁盘读到历程缓冲区,而是从内核缓冲区读到历程缓冲区;一样write也不会都招致内核的写磁盘操纵,只要当内核缓冲区堆集到必定量时才一次写进磁盘,偶然俄然断电,则内核缓冲区的数据会丧失。
当历程请求的数据块不在内核缓冲区时,内核把响应的数据加到哀求数据列表中,然后挂起该历程,为其他历程服务。一段工夫后(很短),内核把响应数据从磁盘读到内核缓冲区,然后再把数据复制到历程缓冲区,最初唤起被挂起的历程。
对于开发环境的选择尽量要轻量级和高度可定制,航空母舰级别的工具往往会让你迷惑不解;
作者:
若相依
时间:
2015-1-21 07:46
笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机
作者:
蒙在股里
时间:
2015-1-25 10:39
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
作者:
愤怒的大鸟
时间:
2015-1-27 12:24
为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。?
作者:
不帅
时间:
2015-2-3 09:29
Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。
作者:
飘灵儿
时间:
2015-2-8 20:02
这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。
作者:
活着的死人
时间:
2015-2-9 23:47
把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
作者:
只想知道
时间:
2015-2-28 08:49
发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。
作者:
小女巫
时间:
2015-3-8 18:57
永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。
作者:
变相怪杰
时间:
2015-3-16 11:43
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
作者:
分手快乐
时间:
2015-3-22 22:16
把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2