Linux编程实现cp操作(学习笔记1)

Linux编程实现cp操作(学习笔记1)

前言

本系列文章为作者学习Linux的一个编程实例,此前已学习文件描述符和有关的API,有不足请评论指正


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现思路

先介绍一下cp 这个命令,cp 英文全拼是copy翻译为复制的意思,用法非常简单常用的参数这里只讲解一个 -R 复制目录,用法:CP {源文件} {目标目录}

  1. 打开源文件src(标记)
  2. src文件内容读取buf到中
  3. 打开并创建新的des
  4. buf内容写入到des
  5. close两个文件

# 二、使用步骤 ## 1.形参引用说明

笔者刚开始不理解执行结果为什么会argc = 3,在主函数 main 中一共有两个参数 int argc, char **argv。对于程序来说,所有的一切都是程序名开始的。在原来的cp指令实现中,cp、src.c、des.c 三者分别对应参数 0、1、2 ,一共三个参数。这三个参数属于主函数 main 中的 int argc。第二个参数 char **argv 是一个二级指针,其所有元素都是一个字符型数组。argv[0] 对应 cp 含有两个字符元素的数组,argv[1] 对应 src 含有三个字符元素的数组, argv[2] 也对应 des 含有三个字符元素的数组。

代码如下(示例):

#include<stdio.h>
int main(int argc,char **argv){
    
    
	printf("param number is %d\n",argc);
	printf("NO.1 param is %s\n",argv[0]);
	printf("NO.2 param is %s\n",argv[1]);
	printf("NO.3 param is %s\n",argv[2]);
	return 0;
}

执行结果如下:
在这里插入图片描述

基于以上结果证明,我们可以实现对应的系统指令 cp 。

2.编程实现cp

编译文件 demo3.c 生成执行文件 demo3
其中涉及到write,read,lseek,malloc等API的使用

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    
    
        int fdSrc;
        int fdDes;
        int n_write;
        int n_read;
        char *readBuf ;
        int n_file;
        if(argc != 3)
        {
    
    
                printf("param error!\n");
                exit(-1);
        }
        fdSrc = open(argv[1],O_RDWR);
        //int open(const char *pathname, int flags, mode_t mode);
        //ssize_t write(int fd, const void *buf, size_t count);
        n_file = lseek(fdSrc,0,SEEK_END);
        lseek(fdSrc,0,SEEK_SET);
        readBuf = (char *)malloc(sizeof(char)*n_file + 8);
        n_read = read(fdSrc,readBuf,n_file);
        //ssize_t read(int fd, void *buf, size_t count);
//      close(fd);
//      fd = open("./file1",O_RDWR);
        fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
        n_write = write(fdDes, readBuf,strlen(readBuf));
        printf("I have read %d bytes \n",n_read);
        close(fdSrc);
        close(fdDes);
        return 0;
}

调用demo3,将demo3.c用我们的cp复制到demo5.c
在这里插入图片描述
利用cat命令查看demo5.c:

使用指令 cat ,会发现两个文件的代码是相同的,表明我们已经成功实现使用自己的代码实现系统自带的指令 cp


3.文章更新记录

  • 2021.3.17 第一次成文

malloc开辟空间,利用lseek查看文件大小(有时间了补充)

猜你喜欢

转载自blog.csdn.net/weixin_45681786/article/details/114951159
今日推荐