cp
命令的基本用法是:
cp 源文件路径 目标文件路径
用户需要在命令行中提供这两个路径,如果没有这两个参数,程序无法知道要复制什么文件或复制到哪里。
一、获取输入路径
我们使用 main函数中的argv参数
用来接收这些输入路径。
在C/C++中,main
函数是程序的入口点,其参数用于接收命令行输入的信息。以下是
int main(int argc, char **argv)
中两个参数的详细解释:
1. argc
(参数计数)
- 全称:Argument Count
- 类型:
int
- 作用:表示命令行参数的数量(包括程序名本身)。
- 值范围:
- 最小值为
1
(仅程序名,无额外参数)。 - 最大值为命令行输入的参数个数 + 1(程序名本身)。
- 最小值为
- 示例:
若运行程序时输入:
./a.out arg1 arg2
则 argc = 3
(程序名 ./a.out
+ arg1
+ arg2
)。
2. argv
(参数向量)
- 全称:Argument Vector
- 类型:
char **
(或char *argv[]
) - 作用:指向字符串数组的指针,每个字符串存储一个命令行参数。
- 数组内容:
argv[0]
:程序名(可能是完整路径或简单名称,取决于系统)。argv[1]
到argv[argc-1]
:用户输入的参数。argv[argc]
:固定为NULL
(哨兵值,标记数组结束)。
- 示例:
对于命令./a.out hello world
:
argv[0] = "./a.out" // 程序名
argv[1] = "hello" // 第一个参数
argv[2] = "world" // 第二个参数
argv[3] = NULL // 结束标记
总结
argc
:参数数量(计数),始终 ≥1。argv
:参数值的字符串数组,以NULL
结尾。argc
和argv
是命令行工具的核心接口:它们让程序能够接收用户输入的文件路径和选项。- 没有这些参数,程序无法动态处理文件:
cp
必须知道源文件和目标文件的位置,而这些信息只能通过命令行参数传递。 - 后续的文件操作(如
open()
、read()
、write()
)依赖这些参数:路径字符串直接来自argv
,参数检查依赖argc
。
二、cp命令的实现
总体思想
- 目标:实现一个基础的
cp
命令,通过系统调用(open
、read
、write
)完成文件复制。 - 核心逻辑:
- 检查参数 → 2. 打开源文件 → 3. 读取内容 → 4. 创建/覆盖目标文件 → 5. 写入内容。
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
char *readBuf;
if(argc != 3){
printf("params error\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDONLY);
int size = lseek(fdSrc,0,SEEK_END);
readBuf = (char *)malloc(sizeof(char)*size + 8);
lseek(fdSrc,0,SEEK_SET);
read(fdSrc,readBuf,size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_EXCL,0600);
if(fdDes == -1){
fdDes = open(argv[2],O_RDWR|O_TRUNC);
}
write(fdDes,readBuf,size);
close(fdSrc);
close(fdDes);
return 0;
}