操作系统实验三.docx

上传人:b****5 文档编号:6488771 上传时间:2023-01-07 格式:DOCX 页数:15 大小:282.03KB
下载 相关 举报
操作系统实验三.docx_第1页
第1页 / 共15页
操作系统实验三.docx_第2页
第2页 / 共15页
操作系统实验三.docx_第3页
第3页 / 共15页
操作系统实验三.docx_第4页
第4页 / 共15页
操作系统实验三.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统实验三.docx

《操作系统实验三.docx》由会员分享,可在线阅读,更多相关《操作系统实验三.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统实验三.docx

操作系统实验三

操作系统-实验三

文件系统的用户界面

一、实验目的

进一步理解、使用和掌握文件的系统调用、文件的标准子例程,能利用和选择这些基本的文件操作完成复杂的文件处理工作。

二、实验题目

1.编写一个文件复制的C语言程序:

分别使用文件的系统调用read(fd,buf,nbytes),write(fd,buf,nbytes)和文件的库函数fread(buf,size,nitems,fp),fwrite(buf,size,nitems,fp),编写一个文件的复制程序(文件大小>1M),文件可以编一个C程序来生成,或使用/usr/bin下的二进制执行文件。

调用格式例如:

copyfile1file2

#include

main(intargc,char*argv[])

{…

fd1=open(argv[1],O_RDONLY);//系统调用

creat(argv[2],0660);

fd2=open(argv[2],O_WRONLY);

while((n=read(fd1,buf,BUFSIZE))>0)

write(fd2,buf,n);

main带参的调用方法例(含测试时间):

time./mycpinfileoutfile

流文件的实验程序请参考该程序完成。

上述函数中nbytes,size和nitems都取值为1时(即一次读写一个字节),比较系统调用和流文件两种程序的执行效率。

当nbytes取4096字节,size取1字节且nitems取4096时(即一次读写4096字节),再次比较这两种程序的执行效率(文件大小>1M)。

如:

创建大文件的方法之一,比如用creat创建一个新文件,用open写打开该文件,用lseek将写指针移到很远处,写入随便一个字符。

比如移动0x100000,用write写个“1”,就会得到一个1M大小的文件。

也可到Linux的/usr/bin找一个1~3M左右的大的执行文件。

对于单独使用的速度较快的计算机,文件要10M~100M。

2.编写一个父子进程之间用无名管道进行数据传送的C程序。

父进程逐一读出一个文件的内容,并通过管道发送给子进程。

子进程从管道中读出信息,再将其写入一个新的文件。

程序结束后,对原文件和新文件的内容进行比较。

3.在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题2的功能。

三、源代码

1.编写一个文件复制的C语言程序:

分别使用文件的系统调用read(fd,buf,nbytes),write(fd,buf,nbytes)和文件的库函数fread(buf,size,nitems,fp),fwrite(buf,size,nitems,fp),编写一个文件的复制程序。

程序一

#defineBUFSIZE4096

#include

#include

#include

#include

intmain(intargc,char*argv[])

{

printf("这个是一次4096个字节的运行结果:

\n");

intinputFd,outputFd,n,mode;

charbuf[BUFSIZE];

inputFd=open(argv[1],O_RDWR|O_CREAT,0777);

outputFd=open(argv[2],O_WRONLY|O_CREAT,0777);

charstr[20]="MynameisLXC";

lseek(inputFd,1000000,0);

write(inputFd,str,strlen(str));

lseek(inputFd,0,0);

while((n=read(inputFd,buf,BUFSIZE))>0)

write(outputFd,buf,n);

close(inputFd);

close(outputFd);

return0;

}

以下为输出结果:

xc@ubuntu:

~$time./copyInputDataOutputData

这个是一次一个字节的运行结果:

real0m1.597s

user0m0.064s

sys0m1.500s

lxc@ubuntu:

~$gccCopyFile.c-ocopy

lxc@ubuntu:

~$time./copyInputDataOutputData

这个是一次4096个字节的运行结果:

real0m0.002s

user0m0.000s

sys0m0.000s

lxc@ubuntu:

~$

程序二

#defineBUF_SIZE1

#include

#include

intmain(intgrgc,char*argv[])

{

printf("这个是一次读取1个字节");

FILE*inputFp,*outputFp;

inputFp=fopen(argv[1],"r+");

outputFp=fopen(argv[2],"w+");

charBUF[BUF_SIZE];

while(!

feof(inputFp))

{

fread(BUF,BUF_SIZE,1,inputFp);

fwrite(BUF,BUF_SIZE,1,outputFp);

fgetc(inputFp);

}

fclose(inputFp);

fclose(outputFp);

}

以下为输出结果

lxc@ubuntu:

~$gccCopyFileV2.c-ocopy

lxc@ubuntu:

~$time./copyInputDataOutPutData

这个是一次读取4096个字节

real0m0.004s

user0m0.000s

sys0m0.000s

lxc@ubuntu:

~$gccCopyFileV2.c-ocopy

lxc@ubuntu:

~$time./copyInputDataOutPutData

这个是一次读取1个字节

real0m0.038s

user0m0.032s

sys0m0.000s

lxc@ubuntu:

~$

2、编写一个父子进程之间用无名管道进行数据传送的C程序。

父进程逐一读出一个文件的内容,并通过管道发送给子进程。

子进程从管道中读出信息,再将其写入一个新的文件。

程序结束后,对原文件和新文件的内容进行比较。

程序

#defineBUFF_SIZE1024

#include

#include

#include

intmain(intargc,char*argv[])

{

intsfd,dfd,n,chan[2];

charbuff[BUFF_SIZE];

sfd=open("InputData",O_RDONLY,0644);

dfd=open("OutputData",O_WRONLY|O_CREAT|O_TRUNC,0644);

pipe(chan);

if(fork())

{

close(chan[0]);

while((n=read(sfd,buff,BUFF_SIZE))>0)

{

write(chan[1],buff,n);

}

close(chan[1]);

}

else

{

close(chan[1]);

read(chan[0],buff,BUFF_SIZE);

write(dfd,buff,strlen(buff));

close(chan[0]);

}

close(sfd);

close(dfd);

return0;

}

以下为输出结果:

3、在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题2的功能。

程序:

写管道端

#defineBUFSIZE256

#include

#include

#include

#include

intmain(intargc,constchar*argv[])

{

intwriteFifoFd,inputDataFd,n;

charbuf[BUFSIZE];

mknod("fifo",S_IFIFO|0666,0);

writeFifoFd=open("fifo",O_WRONLY);

inputDataFd=open("InputData.txt",O_RDONLY);

while((n=read(inputDataFd,buf,BUFSIZE))>0)

write(writeFifoFd,buf,n);

close(inputDataFd);

close(writeFifoFd);

return0;

}

读管道端

#defineBUFSIZE256

#include

intmain(intargc,constchar*argv[])

{

intreadFifoFd,outputDataFd,n;

charbuf[BUFSIZE];

readFifoFd=open("fifo",O_RDONLY);

outputDataFd=open("OutputData.txt",O_CREAT|O_WRONLY,0644);

while((n=read(readFifoFd,buf,sizeof(buf)))!

=0)

write(outputDataFd,buf,n);

close(readFifoFd);

close(outputDataFd);

return0;

}

运行结果

Unix实用程序

一、实验目的

熟悉和掌握Unix的shell命令,正则表达式和过滤器程序的使用。

二、实验题目

1.上机练习ls,ln,ln–s,file,chown,chmode,head,taill,find等命令。

1)假定当前目录中没有ls.save文件,先后键入ls–l和ls–l>ls.save两个命令。

请将第一个ls命令的输出和第二个命令的输出文件ls.save中的内容作仔细比较。

两者有何不同?

并加以解释。

2)比较ls,ls*,ls.,ls.*,ls.?

*这些命令的输出有何不同?

3)以下两条命令:

mvfile1file2

cpfile1file2;rmfile1

的执行效果是否总是相同的?

请仔细推敲并上机验证(提示:

如是软连接如何)。

4)在当前的目录树中显示当天修改的c源程序名。

2.掌握正则表达式的匹配规则,上机练习grep、awk命令。

1)按相反的次序显示输入行及行号。

2)统计输入单词的频度。

3.上机练习df,du,tar命令。

4.上机练习ps,time,nohub命令。

5.上机练习compress,gzip和man等命令。

三、实验结果

(一)上机练习ls,ln,ln–s,file,chown,chmode,head,taill,find等命令。

1)假定当前目录中没有ls.save文件,先后键入ls–l和ls–l>ls.save两个命令。

请将第一个ls命令的输出和第二个命令的输出文件ls.save中的内容作仔细比较。

两者有何不同?

并加以解释。

ln:

创建软连接;

chown:

更改某个文件或目录的所有者,如:

chown

chmod:

设置文件或目录的默认权限的命令,如:

chmoda+xa.sh

head:

用head命令只显示文件或标准输入的头几行,如:

head–n2test.txt

taill:

用户想查看文件的尾部,如:

tail–n2test.txt

find:

查找文件,如:

find/etc–inamepasswd

ls–l的结果

lxc@ubuntu:

~/SourceCode$ls-l

总用量24

-rw-rw-r--1lxclxc5815月2119:

27CopyFile.c

-rw-rw-r--1lxclxc3985月2118:

52CopyFile.c~

-rw-rw-r--1lxclxc4115月2120:

23CopyFileV2.c

-rw-rw-r--1lxclxc3705月1922:

50read.c

-rw-rw-r--1lxclxc5705月2120:

51UnnamedPipe.c

-rw-rw-r--1lxclxc4405月1922:

43write.c

ls–lls.save的结果

总用量24

-rw-rw-r--1lxclxc5815月2119:

27CopyFile.c

-rw-rw-r--1lxclxc3985月2118:

52CopyFile.c~

-rw-rw-r--1lxclxc4115月2120:

23CopyFileV2.c

-rw-rw-r--1lxclxc05月2121:

36ls.save

-rw-rw-r--1lxclxc3705月1922:

50read.c

-rw-rw-r--1lxclxc5705月2120:

51UnnamedPipe.c

-rw-rw-r--1lxclxc4405月1922:

43write.c

ls–l>ls.save的结果多了一个空文件ls.save。

>ls.save是输出重定向。

1)比较ls,ls*,ls.,ls.*,ls.?

*这些命令的输出有何不同?

2)以下两条命令:

mvfile1file2

cpfile1file2;rmfile1的执行效果是否总是相同的?

请仔细推敲并上机验证(提示:

如是软连接如何)

答:

一样,mvfile1file2的功能是把file1文件名更改成file2,cpfile1file2;rmfile1的功能是先复制文件然后删除源文件。

软连接的功能也一样。

3)在当前的目录树中显示当天修改的C源程序名。

答:

find.-name"*.c"-mtime-24

(二)掌握正则表达式的匹配规则,上机练习grep、awk命令。

1)按相反的次序显示输入行及行号。

lxc@ubuntu:

~$grep-n'a'Test|sort-r

6:

a

5:

ab

4:

abc

3:

abcd

2:

abcde

1:

abcdef

2)统计输入单词的频度。

lxc@ubuntu:

~$awk'{for(i=1;i<=NF;i++)a[$i]++}END{for(iina)printi"="a[i]}'Test

ab=2

abcdef=1

abc=2

a=1

abcd=1

abcde=1

(三)上机练习df,du,tar命令。

df:

显示指定磁盘文件的可用空间

du:

统计目录(或文件)所占磁盘空间的大小。

tar:

解压或压缩文件。

解压:

tar–zxvf,压缩:

tarcvffilename.tarfilename

(四)上机练习ps,time,nohub命令。

ps:

列出系统中当前运行的那些进程

time:

用于测量一个命令的运行时常

nohop:

切换到后台执行

(五)上机练习man命令。

帮助文档

lxc@ubuntu:

~$manls

lxc@ubuntu:

~$manascii

 

软件开发工具

(一)实验目的

熟悉和掌握unix主要的软件开发工具ar,make,(SCCS,可选)的使用。

重点是make。

(二)实验题目

课本习题11(p338)(3)、(4)

(三)实验结果

练习3主程序

lxc@ubuntu:

~$gcc-cFileA.c

lxc@ubuntu:

~$gcc-cFileB.c

lxc@ubuntu:

~$arrvlibfile.aFile[A-B].o

ar:

正在创建libfile.a

a-FileA.o

a-FileB.o

lxc@ubuntu:

~$artvlibfile.a

rw-rw-r--1000/10001044May2210:

292016FileA.o

rw-rw-r--1000/10001048May2210:

292016FileB.o

lxc@ubuntu:

~$arxlibfile.aFileA.o

练习3实验截图

 

题目4主程序

HEADER=netdefs.h

OBJECT=subnet.oservice.o

network:

$(OBJECT)

cc-onetwork$(OBJECT)

subnet.oservice.o:

$(HEADER)

clean:

rmnetwork$(OBJECT)

练习4运行截图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1