操作系统第一次小组实验.docx
- 文档编号:25875509
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:15
- 大小:16.41KB
操作系统第一次小组实验.docx
《操作系统第一次小组实验.docx》由会员分享,可在线阅读,更多相关《操作系统第一次小组实验.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统第一次小组实验
2、实现linux系统的cp命令
一、实验目的:
1、熟悉linux操作系统下的一些常用的命令。
2、能够使用read、write实现简单的cp命令。
3、能够使用fread、fwrite实现简单的cp命令。
4、理解fread、read以及fwrite、write的效率和区别。
二、实验的内容以过程。
(一)、用read&write实现linux的cp命令。
1、实验代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#definefore0001
intflags=0;
voidprint_help()
{
printf("mycp[-f]filename1filename2\n");
}
char*getnewpath(char*pathname,char*concat)
{
char*newpath;
charc=pathname[strlen(pathname)-1];
newpath=(char*)malloc(strlen(pathname)+strlen(concat)+1);
if(newpath==NULL)
{
perror("memerymalloc:
");
exit(0);
}
sprintf(newpath,"%s%s%s",pathname,c=='/'?
"":
"/",concat);
returnnewpath;
}
intcp(char*dest,char*src,intflags)
{
charbuff[1024];
intfddest,fdsrc;
char*newsrc,*newdest;
booldestexist=true;//目标文件是否已存在
DIR*dp;
structdirent*dir;
structstatsrcstat,deststat;
intrelen=0,wrlen=0;
if(lstat(src,&srcstat)<0)
{
perror(src);
exit(0);
}
if(lstat(dest,&deststat)<0)
{
if(errno!
=ENOENT)
{
return0;
}
destexist=false;
}
if(S_ISDIR(srcstat.st_mode))//目录
{
if(!
destexist)
{
if(mkdir(dest,srcstat.st_mode)<0)//按src的权限建目录
{
perror("can'tcreate");
return0;
}
}
elseif(!
S_ISDIR(deststat.st_mode))
{
printf("%snotadiretory",dest);
return0;
}
if((dp=opendir(src))==NULL)
{
perror(src);
return0;
}
while((dir=readdir(dp))!
=NULL)
{
if(strcmp(dir->d_name,".")==0||strcmp(dir->d_name,"..")==0)
continue;
newsrc=getnewpath(src,dir->d_name);
newdest=getnewpath(dest,dir->d_name);
cp(newdest,newsrc,flags);
free(newdest);
free(newsrc);
}
}
if(S_ISREG(srcstat.st_mode))//普通文件
{
if(destexist&&!
(flags&fore))//覆盖?
{
intch;
printf("file%sisexistcoverit?
[n/y]",dest);
while(ch=getchar())
{
if(ch=='y'||ch=='Y')
break;
if(ch=='n'||ch=='N')
exit(0);
else
printf("pleaseinput[n/y]:
");
getchar();//接收回车字符
}
}
if((fdsrc=open(src,O_RDONLY))==-1)
{
perror(src);
return0;
}
if((fddest=open(dest,O_WRONLY|O_TRUNC|O_CREAT,srcstat.st_mode))==-1)
{
perror(dest);
return0;
}
while((relen=read(fdsrc,buff,sizeof(buff)))>0)
{
if(write(fddest,buff,relen)==-1)
{
perror("error:
");
return0;
}
memset(buff,0,sizeof(buff));
}
if(relen==-1)
{
perror("error:
");
return0;
}
}
close(fdsrc);
close(fddest);
return0;
}
voidargs_cmd(intargc,char**argv,char*dest,char*src,intflags)
{
inti,j;
intch;
while((ch=getopt(argc,argv,"f"))!
=-1)
{
switch(ch)
{
case'f':
flags|=fore;
break;
default:
printf("invaildoption%c\n",ch);
print_help();
exit(0);
}
}
if(optind+2!
=argc||argc==2)
{
print_help();
exit(0);
}
strcpy(src,argv[optind]);
strcpy(dest,argv[optind+1]);
return;
}
intmain(intargc,char**argv)
{
charsrc[128],dest[128];
args_cmd(argc,argv,dest,src,flags);
cp(dest,src,flags);
return0;
}
2、linux下命令模拟步骤:
gccmycp.c–omycp
./mycpliangtao.txtliangtao_test.txt
(二)、fread&fwrite实现linux的cp命令
1、实验代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#definefore0001
intflags=0;
voidprint_help()
{
printf("mycp[-f]filename1filename2\n");
}
char*getnewpath(char*pathname,char*concat)
{
char*newpath;
charc=pathname[strlen(pathname)-1];
newpath=(char*)malloc(strlen(pathname)+strlen(concat)+1);
if(newpath==NULL)
{
perror("memerymalloc:
");
exit(0);
}
sprintf(newpath,"%s%s%s",pathname,c=='/'?
"":
"/",concat);
returnnewpath;
}
intcp(char*dest,char*src,intflags)
{
charbuff[1024];
intfddest,fdsrc;
char*newsrc,*newdest;
booldestexist=true;//目标文件是否已存在
DIR*dp;
structdirent*dir;
structstatsrcstat,deststat;
intrelen=0,wrlen=0;
if(lstat(src,&srcstat)<0)
{
perror(src);
exit(0);
}
if(lstat(dest,&deststat)<0)
{
if(errno!
=ENOENT)
{
return0;
}
destexist=false;
}
if(S_ISDIR(srcstat.st_mode))//目录
{
if(!
destexist)
{
if(mkdir(dest,srcstat.st_mode)<0)//按src的权限建目录
{
perror("can'tcreate");
return0;
}
}
elseif(!
S_ISDIR(deststat.st_mode))
{
printf("%snotadiretory",dest);
return0;
}
if((dp=opendir(src))==NULL)
{
perror(src);
return0;
}
while((dir=readdir(dp))!
=NULL)
{
if(strcmp(dir->d_name,".")==0||strcmp(dir->d_name,"..")==0)
continue;
newsrc=getnewpath(src,dir->d_name);
newdest=getnewpath(dest,dir->d_name);
cp(newdest,newsrc,flags);
free(newdest);
free(newsrc);
}
}
if(S_ISREG(srcstat.st_mode))//普通文件
{
if(destexist&&!
(flags&fore))//覆盖?
{
intch;
printf("file%sisexistcoverit?
[n/y]",dest);
while(ch=getchar())
{
if(ch=='y'||ch=='Y')
break;
if(ch=='n'||ch=='N')
exit(0);
else
printf("pleaseinput[n/y]:
");
getchar();//接收回车字符
}
}
if((fdsrc=open(src,O_RDONLY))==-1)
{
perror(src);
return0;
}
if((fddest=open(dest,O_WRONLY|O_TRUNC|O_CREAT,srcstat.st_mode))==-1)
{
perror(dest);
return0;
}
FILE*fd=fopen(fddest,"w+b");
FILE*fs=fopen(fdsrc,"w+b");
while((relen=fread(buff,sizeof(buff),1,fs))!
=1)
{
if(fwrite(buff,sizeof(buff),1,fd)!
=1)
{
perror("error:
");
return0;
}
memset(buff,0,sizeof(buff));
}
if(relen==-1)
{
perror("error:
");
return0;
}
}
close(fdsrc);
close(fddest);
return0;
}
voidargs_cmd(intargc,char**argv,char*dest,char*src,intflags)
{
inti,j;
intch;
while((ch=getopt(argc,argv,"f"))!
=-1)
{
switch(ch)
{
case'f':
flags|=fore;
break;
default:
printf("invaildoption%c\n",ch);
print_help();
exit(0);
}
}
if(optind+2!
=argc||argc==2)
{
print_help();
exit(0);
}
strcpy(src,argv[optind]);
strcpy(dest,argv[optind+1]);
return;
}
intmain(intargc,char**argv)
{
charsrc[128],dest[128];
args_cmd(argc,argv,dest,src,flags);
cp(dest,src,flags);
return0;
}
2、linux系统下cp命令的模拟步骤:
gccmycp2.c–omycp2
./mycp2liangtao.txtliangtao_test.txt
三、测试数据和实验结果
实验结果正常,代码没有重大错误,文件拷贝成功。
其中两种方法的各自的运行时间情况如下:
Read&write:
real0m3.8865
fread&fwrite:
real0m0.0035
四、实验分析及总结
本次实验在于对read、write和fread、fwrite函数的了解和熟练的使用。
基于上述的实验测试数据以及read和fread、write和fwrite的原理的比较,
认为实验结果是正确的。
主要在于fread类型的函数带有缓存机制,相同大小的文件,使用fread比使用read读取文件的次数相对的要少,因此所花的时间也相对较少。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 第一次 小组 实验