Linux文件编程——实现cp命令

发布于:2025-05-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

 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.outarg1 + 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 命令,通过系统调用(openreadwrite)完成文件复制。
  • 核心逻辑
    1. 检查参数 → 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;
}