操作系统实验三.docx
《操作系统实验三.docx》由会员分享,可在线阅读,更多相关《操作系统实验三.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统实验三
操作系统-实验三
文件系统的用户界面
一、实验目的
进一步理解、使用和掌握文件的系统调用、文件的标准子例程,能利用和选择这些基本的文件操作完成复杂的文件处理工作。
二、实验题目
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;
}
以下为输出结果:
xcubuntu:
~$time./copyInputDataOutputData
这个是一次一个字节的运行结果:
real0m1.597s
user0m0.064s
sys0m1.500s
lxcubuntu:
~$gccCopyFile.c-ocopy
lxcubuntu:
~$time./copyInputDataOutputData
这个是一次4096个字节的运行结果:
real0m0.002s
user0m0.000s
sys0m0.000s
lxcubuntu:
~$
程序二
#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);
}
以下为输出结果
lxcubuntu:
~$gccCopyFileV2.c-ocopy
lxcubuntu:
~$time./copyInputDataOutPutData
这个是一次读取4096个字节
real0m0.004s
user0m0.000s
sys0m0.000s
lxcubuntu:
~$gccCopyFileV2.c-ocopy
lxcubuntu:
~$time./copyInputDataOutPutData
这个是一次读取1个字节
real0m0.038s
user0m0.032s
sys0m0.000s
lxcubuntu:
~$
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的结果
lxcubuntu:
~/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)按相反的次序显示输入行及行号。
lxcubuntu:
~$grep-n'a'Test|sort-r
6:
a
5:
ab
4:
abc
3:
abcd
2:
abcde
1:
abcdef
2)统计输入单词的频度。
lxcubuntu:
~$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命令。
帮助文档
lxcubuntu:
~$manls
lxcubuntu:
~$manascii
软件开发工具
(一)实验目的
熟悉和掌握unix主要的软件开发工具ar,make,(SCCS,可选)的使用。
重点是make。
(二)实验题目
课本习题11(p338)(3)、(4)
(三)实验结果
练习3主程序
lxcubuntu:
~$gcc-cFileA.c
lxcubuntu:
~$gcc-cFileB.c
lxcubuntu:
~$arrvlibfile.aFile[A-B].o
ar:
正在创建libfile.a
a-FileA.o
a-FileB.o
lxcubuntu:
~$artvlibfile.a
rw-rw-r--1000/10001044May2210:
292016FileA.o
rw-rw-r--1000/10001048May2210:
292016FileB.o
lxcubuntu:
~$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运行截图