交大继续教育学院操作系统实验3参考答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验三文件系统的用户界面参考答案(一)实验目的进一步理解、使用和掌握文件的系统调用、文件的标准子例程,能利用和选择这些基本的文件操作完成复杂的文件处理工作。(二)源代码1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd,buf,nbytes),write(fd,buf,nbytes)和文件的库函数fread(buf,size,nitems,fp),fwrite(buf,size,nitems,fp),编写一个文件的复制程序。下面的程序是调用time分别获得程序段运行的开始时间和结束时间,再计算两者之差获得程序段运行的时间。当然最方便的方法是在所运行的程序前面加上time,其运行方法是:time命令[命令参数]命令执行完成后,time程序显示命令运行所用的总时间,系统花费的时间和命令的纯执行时间,UNIX中单位为10毫秒,Linux中单位为毫秒。但这种方法得到的是程序运行的总时间,而不能得到某一程序段的运行时间。#includestdio.h#includestring.h#includefcntl.h/*copyfile,ifway==1,useread/write,elseusefread/fwrite,atthesametime,itcountstimeconsumed*/intmycopy(intway,intstep){time_tstart_tm,stop_tm;FILE*srcf,*destf;charbuff[4096];inti,sfd,dfd;time(&start_tm);//获得起始时间for(i=0;i1024;i=i+step){if(way==1){sfd=open(in.txt,O_RDONLY,0644);//输入文件dfd=open(out.txt,O_WRONLY|O_CREAT|O_TRUNC,0644);//输出文件read(sfd,buff,step);write(dfd,buff,step);close(sfd);close(dfd);}else{srcf=fopen(in.txt,r);destf=fopen(out.txt,w);fread(buff,step*sizeof(char),1,srcf);fwrite(buff,step*sizeof(char),1,destf);close(srcf);close(destf);}}time(&stop_tm);//获得结束时间printf(\ntimeusedforcopyfilebymeansof%s,%dbytepertime:%ds,way?read,write:fread,fwrite,step,(int)(stop_tm-start_tm));//printinformationfortestingreturn0;}intmain(intargc,char**argv){/*当上述函数中nbytes,size和nitems都取值为1时(即一次读写一个字节),比较这两种程序的执行效率。*/if(mycopy(1,1))return1;if(mycopy(0,1))return1;/*当nbytes取1024字节,size取1024字节,且nitems取1时(即一次读写1024字节),再次比较这两种程序的执行效率。*/if(mycopy(1,1024))return1;if(mycopy(0,1024))return1;return0;}2.编写一个父子进程之间用无名管道进行数据传送的C程序。父进程逐一读出一个文件的内容,并通过管道发送给子进程。子进程从管道中读出信息,再将其写入一个新的文件。程序结束后,对原文件和新文件的内容进行比较。#includestdio.h#includestring.h#includefcntl.hintmain(intargc,charargc){intsfd,dfd,n,chan[2];charbuff[1024];sfd=open(in.txt,O_RDONLY,0644);//输入文件dfd=open(out.txt,O_WRONLY|O_CREAT|O_TRUNC,0644);//输出文件pipe(chan);//openapipeif(fork()){//startachildprocesstosendfilewhile((n=read(sfd,buff,1024))0){close(chan[0]);write(chan[1],buff,n);close(chan[1]);}}else{//infatherprocess,receivefileclose(chan[1]);read(chan[0],buf,1024);write(dfd,buff,strlen(buff));close(chan[0]);}close(sfd);close(dfd);return0;}3.在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题3的功能。#includestdio.h#includestring.h#includefcntl.h#includesys/stat.hintmain(intargc,char**argv){intsfd,dfd,sp,dp,iofile;charbuff[1024];sfd=open(in.txt,O_RDONLY,0644);dfd=open(out.txt,O_WRONLY|O_CREAT|O_TRUNC,0644);mknod(iofile,S_IFIFO|0666,0);//nameapipeif(fork()){sp=open(iofile,O_WRONLY);while((n=read(sfd,buff,1024))0)write(pp,buff,n);close(sp);close(sfd);}else{dp=open(iofile,O_RDONLY|O_NDELAY);while((n=read(dp,buff,1024))!=1)if(n==0)sleep(5);elsewrite(df,buff,strlen(buff));close(dp);close(dfd);}return0;}Unix实用程序参考答案(一)实验目的熟悉和掌握Unix的shell命令,正则表达式和过滤器程序的使用。(二)实验题目1上机练习ls,ln,ln–s,file,chown,chmode,head,taill,find等命令。(1)假定当前目录中没有ls.save文件,先后键入ls–l和ls–lls.save两个命令。请将第一个ls命令的输出和第二个命令的输出文件ls.save中的内容作仔细比较。两者有何不同?并加以解释。(2).比较ls,ls*,ls.,ls.*,ls.?*这些命令的输出有何不同?(3)以下两条命令:mvfile1file2cpfile1file2;rmfile1的执行效果是否总是相同的?请仔细推敲并上机验证(提示:如是软连接如何)。(4)在当前的目录树中显示当天修改的c源程序名。2.掌握正则表达式的匹配规则,上机练习grep、awk命令。(1)按相反的次序显示输入行及行号。(2)统计输入单词的频度。3.上机练习df,du,tar命令。4.上机练习ps,time,nohub命令。5.上机练习compress,gzip和man等命令。(三)实验结果1上机练习ls,ln,ln–s,file,chown,chmode,head,taill,find等命令。(1)假定当前目录中没有ls.save文件,先后键入ls–l和ls–lls.save两个命令。请将第一个ls命令的输出和第二个命令的输出文件ls.save中的内容作仔细比较。两者有何不同?并加以解释。ln:创建软连接;chown:更改某个文件或目录的所有者chmode:设置文件或目录的默认权限的命令head:用head命令只显示文件或标准输入的头几行taill:用户想查看文件的尾部find:查找文件ls–l的结果ls–lls.save的结果可以看出ls–lls.save的结果多了一个空文件ls.sav,因为该命令先根据输出转向生成文件ls.save,再运行ls命令时列出了该文件,并存入ls.save文件中。(2)比较ls,ls*,ls.,ls.*,ls.?*这些命令的输出有何不同?(3)以下两条命令:mvfile1file2cpfile1file2;rmfile1的执行效果是否总是相同的?请仔细推敲并上机验证(提示:如是软连接如何)答:一样,mvfile1file2的功能是把file1文件名更改成file2cpfile1file2;rmfile1的功能是先复制文件然后删除源文件。但file1里面的内容没有更改。软连接的功能也一样。(4)在当前的目录树中显示当天修改的C源程序名。2.掌握正则表达式的匹配规则,上机练习grep、awk命令。(1)按相反的次序显示输入行及行号。(2)统计输入单词的频度。3.上机练习df,du,tar命令。df:件系统的磁盘空间占用情况du:统计目录(或文件)所占磁盘空间的大小。4.上机练习ps,time,nohub命令。ps:显示瞬间行程(process)的动态;time:返回当前的UNIX时间戳nohop:和注销影响,得以继续运行5.上机练习compress,gzip和man等命令。cmpress:缩打包文件gzip:压缩/解压缩文件man:用来让使用者在使用时查询指令

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功