最近一段时间,做了关于linux下的shell三个实验,收获颇多。其中一个关于创建自定义命令,来实现linux中的copy功能。自己大一的时候C++学的不是很好,现在突然做这种题目,顿感头大。不得不说,互联网的确是能解决很多困难。首先提到的一种方法是通过alias内建命令的方法,主要做法是:alias 自定义命令名=‘已有命令’。不过这种做法看似方便,不过没有剖开命令见本质,被老师否决了。好吧,开始用自己不擅长的c语言写。下面是第一个版本的:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
FILE *in,*out;
char buf[100];
size_t size;
in=fopen(argv[1],"rb");
out=fopen(argv[2],"wb+");
if(!in)
{
printf("open %s failed:%s\n",argv[1],strerror(errno));
return 1;
}
if(!out)
{
printf("open %s failed:%s\n",argv[2],strerror(errno));
return 1;
}
while((size=fread(buf,1,sizeof(buf),in))==sizeof(buf))
{
if(fwrite(buf,1,size,out)<size){
printf("write error:%s\n",strerror(errno));
return 1;
}
}
if(feof(in)){
printf("sucess!");
}else{
printf("error:%s\n",strerror(errno));
}
fclose(in);
fclose(out);
return 0;
}
这个版本有个缺陷,使用命令拷贝文件的时候,粘贴的地方名字需要自己给出来如:mycopy 1.txt Documents/1.txt
很多同学也基本上是基于这个原理做的,可是自己感觉这种解法和cpy命令还是区别蛮大的,于是便有了下面这个修订版:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
FILE *in,*out;
char buf[100];
size_t size;
char *t=malloc(strlen(argv[1])+strlen(argv[2])+2);
strcpy(t,argv[2]);
strcat(t,"/");
strcat(t,argv[1]);
argv[2]=t;
in=fopen(argv[1],"rb");
out=fopen(argv[2],"wb+");
if(!in)
{
printf("open %s failed:%s\n",argv[1],strerror(errno));
return 1;
}
if(!out)
{
printf("open %s failed:%s\n",argv[2],strerror(errno));
return 1;
}
while((size=fread(buf,1,sizeof(buf),in))==sizeof(buf))
{
if(fwrite(buf,1,size,out)<size){
printf("write error:%s\n",strerror(errno));
return 1;
}
}
if(feof(in)){
printf("sucess!");
}else{
printf("error:%s\n",strerror(errno));
}
fclose(in);
fclose(out);
}
只是添了五行代码呈现的效果就不同了。这是该命令呈现的效果: