手写linux中的cp指令
我们平时在Linux环境下复制一个文件,一般都直接用:
cp 文件a 文件b
面试时可能会遇到叫你手写cp指令的情况!
argc
用来记录程序启动时就传入的参数个数, char **argv
用来记录每个实参的地址注意argv
可使用数组也可使用二级指针,且注意类型为char型
一个具有注脚的文本。
用一点简单的代码解释一下 argc 、argv的作用
。
#include<stdio.h>
int main(int argc,char **argv)
{
printf("totol prams:%d\n",argc);
printf("No1.arams:%s\n",argv[0]);
printf("No2.arams:%s\n",argv[1]);
printf("No3.arams:%s\n",argv[2]);
return 0;
}
在命令行界面运行生成的text.out
./text.out first second
之后我们可以看到
可以看到在./text.out first second命令后有三个参数,第一个是程序名字,第二个是first ,第三个是second,事实证明确实是三个参数,这样就容易理解了吧。是不是很想cp指令的格式
代码的实现
接下来加亿小小点改进。
思路是什么呢?
1.首先我们肯定要打开源文件,src.c
2.读取源文件的内容保存到readbuf中。
3.创建/打开 目标文件des.c
4.将readbuf中的内容写到des.c中
5.关闭两个文件(文件操作最后都需要关闭)
这样就得到了我们要得代码QvQ
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
int fdsrc;
int fddes;
char *readbuf=NULL;
if(argc!=3){
printf("pararm error\n");
exit(-1);
}
int size =lseek(fdsrc,0,SEEK_END);
lseek(fdsrc,0,SEEK_SET);
readbuf=(char*)malloc(sizeof(char)*size+8);
int n_read = read(fdsrc,readbuf,size);
fdsrc=open(argv[1],O_RDWR);
lseek(fdsrc,0,SEEK_SET);
fddes = open(argv[2],O_RDWR|O_CREAT,0600);
int n_write = (fddes,readbuf,strlen(readbuf));
close(fdsrc);
close(fddes);
}
最后让我们看看结果