Chapter2-用户、文件操作与联机帮助_第1页
Chapter2-用户、文件操作与联机帮助_第2页
Chapter2-用户、文件操作与联机帮助_第3页
Chapter2-用户、文件操作与联机帮助_第4页
Chapter2-用户、文件操作与联机帮助_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unix/Linux编程,北京化工大学信息科学与技术学院计算机系易军凯yijk,第2章用户、文件操作与联机帮助编写who命令,概念与技巧:,联机帮助的作用与使用方法Unix的文件操作函数:open、read、write、lseek、close文件的建立与读写文件描述符缓冲:用户级的缓冲与内核级的缓冲内核模式、用户模式、和系统调用的代价Unix表示时间的方法与时间格式间的转换借助utmp文件来列出已登录的用户系统调用中的错误检测与处理,相关的系统调用:open、read、write、creat、lseek、closeperror相关命令:manwhocplogin,主要内容:,2.1编写who命令2.2编写cp(读和写)2.3提高文件I/O效率的方法,使用缓冲2.4内核缓冲技术2.5文件读写,2.1.1who命令能做些什么?2.1.2who命令是如何工作的?2.1.3如何编写who?,2.1编写who命令,2.1.1who命令能做些什么?,运行$who用于获取信息:哪些用户正在使用系统,系统是否很繁忙,某人是否正在使用系统等。查看who的帮助:$manwho描述(DESCRIPTION)部分是关于命令功能的详细阐述;选项(OPTIONS)部分给出了命令行中每一个选项的说明;参阅(SEEALSO)包含与这个命令相关的其它主题。,2.1.2who命令是如何工作的?,阅读联机帮助:$manwho搜索联机帮助:$mankuser|more阅读.h文件:$more/usr/include/foo.h从参阅部分(SEEALSO)中的得到启示,who的工作原理:,who通过读文件来获得需要的信息,而每个用户在文件中都有对应的记录。,2.1.3如何编写who,(1)问题:如何从文件中读取数据结构?可以用getc和fgets逐个字节地读取,但这样太繁琐,而且效率很低。查看联机帮助:$mankfile|grepread$man2read,(2)答案:使用open、read和close,intfd=open(char*name,inthow),参数:name:文件名how:O_RDONLY,O_WRONLY,orO_RDWR,返回值:-1遇到错误int成功返回,打开文件是内核提供的服务,文件被顺利打开,内核会返回一个正整数的值,这个数值就叫做文件描述符。必须通过文件描述符对文件进行操作。,fd=open(name,mode)n=read(fd,array,numchars)目标:把数据读取到缓冲区返回值:-1遇到错误numread成功读取,返回读取的字节数目。Intrusult=close(intfd)关闭进程和文件fd之间的连接,如果关闭的过程中出现错误,close返回-1。,(3)编写who1.c,main(intac,char*av)structutmputbuf;/*readinfointohere*/intutmpfd;/*readfromthisdescriptor*/if(utmpfd=open(INFOFILE,O_RDONLY)=-1)fprintf(stderr,%s:cannotopen%sn,*av,INFOFILE);exit(1);while(read(utmpfd,/*wentok*/,show_info(structutmp*utbufp)printf(%-8.8s,utbufp-ut_name);/*thelogname*/printf();/*aspace*/printf(%-8.8s,utbufp-ut_line);/*thetty*/printf();/*aspace*/printf(%10ld,utbufp-ut_time);/*logintime*/printf();/*aspace*/#ifdefSHOWHOSTprintf(%s),utbufp-ut_host);/*thehost*/#endifprintf(n);/*newline*/,(4)显示登录信息,两处问题需要改进:,消除空白记录正确显示登录时间,解决方法:,使用ut_typectime将表示时间的整数值转换成人们日常所使用的时间形式who2.c,2.2.1问题1:cp命令能做些什么?答案:复制文件典型用法:$cpsourcefiletargetfile如果targetfile所指的文件不存在,cp就创建这个文件,如果已经存在就覆盖。2.2.2问题2:cp命令是如何创建/重写文件的?答案:creatwrite,2.2编写CP(读和写),创建/重写文件intfd=creat(char*filename,mode_tmode)creat告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它;如果已经存在,就把它的内容清空,把文件的长度设为0。如果内核成功创建文件,则把文件的许可位设置为mode所指定的值。写文件n=write(fd,buffer,num)如果内核不能写入或写入失败,write返回-1,如果成功写入,则返回写入的字节数。,2.2.3问题3:如何编写cp,cp1.c,通过读和写来复制文件,#defineBUFFERSIZE4096#defineCOPYMODE0644main(intac,char*av)intin_fd,out_fd,n_chars;charbufBUFFERSIZE;/*checkargs*/if(ac!=3)fprintf(stderr,usage:%ssourcedestinationn,*av);exit(1);,/*openfiles*/if(in_fd=open(av1,O_RDONLY)=-1)oops(Cannotopen,av1);if(out_fd=creat(av2,COPYMODE)=-1)oops(Cannotcreat,av2);/*copyfiles*/while(n_chars=read(in_fd,buf,BUFFERSIZE)0)if(write(out_fd,buf,n_chars)!=n_chars)oops(Writeerrorto,av2);/*closethemup*/if(close(in_fd)=-1|close(out_fd)=-1)oops(Errorclosingfiles,);voidoops(char*s1,*s2)fprintf(stderr,Error:%s%sn,s1,s2);exit(1);,缓冲区的大小对性能的影响:文件大小2500字节如果缓冲区大小100字节那么需要25次read()和25次write()如果缓冲区大小1000字节那么需要3次read()和3次write(),2.3提高文件I/O效率的方法使用缓冲,为什么系统调用需要很多时间?,系统调用时的控制流图,传输数据:用户进程位于用户空间,内核位于系统空间,磁盘只能被内核直接访问。用户模式和管理员模式的切换,用utmplib来缓冲main函数调用utmplib.c中的函数来取得下一条utmp记录utmplib.c中定义的函数每次从文件中读取得6条记录放入数组中当数组中的6条记录都被取走后,才调用内核服务重新读取数据,在who2.c中使用缓冲技术,应用内核缓冲技术的结果:提高磁盘I/O效率优化磁盘的写操作需要及时得将缓冲数据写入磁盘,2.4内核缓冲技术,内核缓冲磁盘上的数据,如何工作的?1、打开文件utmp;负责注销的程序必须对文件utmp进行读(找到登记记录)和写(修改登记记录)操作,必须先打开这个文件:fd=open(UTMP_FILE,O_RDWR),2.5文件读写,注销过程:做了些什么?系统改变了文件utmp中相应的登录记录,2、从utmp中找到包含你所在终端的登录记录;3、对当前记录做修改问题:在文件操作中,如何改变一个文件的当前读/写位置?答案:系统调用lseek4、关闭文件调用close(fd),编写终端注销的代码intlogout_tty(char*line)intfd;structutmprec;intlen=sizeof(structutmp);intretval=-1;if(fd=open(UTMP_FILE,O_RDWR)=-1)return-1;while(read(fd,if(time(,While(read(fd,rec,utmplen)=utmplen)/*getnextrecord*/if(strcmp(rec.ut_line,myline)=0)/*what,myline?*/revise_entry();/*removemyname*/,内核为每个打开的文件保存一个位置指针,Read从当前位置读入指定长度的数据,然后移动当前位置指针,指向下一个未读的数据。,指针是与文件描述符相关联的,而不是与文件关联,如果两个程序同时打开一个文件,会有两个指针,两个程序对文件的读操作不会互相干扰。,off_toldpos=lseek(intfd,off_tdist,intbase)参数:fd文件描述符dist移动的距离base:SEEK_SET=文件的开始SEEK_CUR=当前位置SEEK_END=文件结尾返回值:-1遇到错误oldpos指针变化前的位置,Lseek的用法,小结,Who命令通过读系统日志的内容显示当前已经登录的用户。系统调用操作文件open(filename,how)creat(filename,mode)read(fd,buffer,amt)write(fd,buffer,amt)lseek(fd,distance,base)close(fd),进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论