实现思路:
1、打开demo1.c文件
2、把demo1.c文件中的内容写到buf上
3、创建/打开demo2.c文件
4、把写入的buf中的文件内容读取到demo2.c中
5、关闭两个文件
引入main函数标准原型:
main(int argc, char **argv, char **enpv);或者main(int argc, char *argv[], char *enpv[]);
int argc:整型,其中包括的是命令行参数的个数(如下图展示)
char **argv:二维的char型指针,存放命令行参数字符串
char **enpv:二维的char型指针,存放环境变量
#include<stdio.h>
int main(int argc,char *argv[])
{
printf("参数总个数是:%d\n",argc);
printf("第一个参数是:%s\n",argv[0]);
printf("第二个参数是:%s\n",argv[1]);
printf("第三个参数是:%s\n",argv[2]);
return 0;
}
程序运行的结果:./a.out demo1 demo2
参数总个数是:3
第一个参数是:./a.out
第二个参数是:demo1
第三个参数是:demo2
实现cp指令代码
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
int main(int argc,char *argv[])//argc表示参数的个数,argv表示字符串数组是二级指针
{
int fd;
int fd2;
int size;
int n_read;
int n_write;
char*readbuf=NULL;
if(argc!=3){
printf("input error\n");
exit(0);//正常退出
}
fd=open(argv[1],O_RDWR);
if(fd==-1){
printf("file open failed\n");
perror("open");
exit(0);
}
size=lseek(fd,0,SEEK_END);
readbuf=(char*)malloc(sizeof(char)*size+8);
lseek(fd,0,SEEK_SET);
n_read=read(fd,readbuf,sizeof(char)*size+8);
if(n_read==-1){
printf("file read failed\n");
perror("read");
exit(0);
}
fd2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
if(fd2==-1){
printf("open error\n");
perror("open");
exit(0);
}
n_write=write(fd2,readbuf,strlen(readbuf));
if(n_write==-1){
printf("file write failed");
perror("write");
exit(0);
}
close(fd);
close(fd2);
return 0;
}
但是我们在运行这个实现cp指令的代码时(我们在编译时改名字为cp),需要输入./cp xxx xxx
但是真实的cp指令并不需要“./”,这是因为环境变量的原因,大家可以看一下下面这个文章里面提到的环境变量的小节部分:进程相关概念及C程序的存储空间的分配-CSDN博客