• 【回眸】Linux内核(五)复刻cp命令


    Linux内核如何复刻CP命令,制作“mycp”

    前言

    学习linux系统的对cp命令一定不陌生,如何去自己写一个mycp指令?
    首先需要了解cp命令运作的原理

    1、接收参数(诸如:cp demo1.c demo2.c)
    2、打开原文件
    3、复制原文件的信息
    4、粘贴到目标文件里(目标)
    
    • 1
    • 2
    • 3
    • 4

    接下来cp命令的思路
    //验证参数是否等于3,如果不等于3 ,打印 参数错误 并退出
    //以读写的方式打开文件,赋值给fdsrc,如果不存在,则创建一下
    //打开源文件
    //打开目标文件,如果没有就创建
    //头文件要写全
    //传参,3个参数
    //定义fdSrc和fdDes
    //定义readBuf,开辟1024字节,并全部初始化
    //判断参数是否等于3,否则判断参数有问题,且退出程序
    //赋值fdsrc,读写方式打开传入的参数2(argv【1】)
    //lseek算出文件大小
    //赋值n_read,读取readBuf的内容
    //赋值fdDes,如果不存在des文件,则创建新文件
    //赋值size为lseek计算文件大小
    //lseek一下
    //redbuf开辟空间,原文件大小+8字节(char *)malloc(sizeof(char)*size+8)因为防止空间不够,做一个冗余
    //赋值n_read read(fdSrc,readBuf,strlen(readBuf))
    //fdDes 读写打开,不存在就创建,写入readbuf
    //赋值n_write write(fdDes,readBuf,strlen(readBuf)
    //关闭原文件
    //关闭目标文件

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<string.h>
    #include<stdlib.h>
    int main(int argc,char **argv){
        int fdSrc;
        int fdDes;
        char *readBuf = NULL;
        if (argc != 3){
            printf("param error!\n");
            exit(-1);
        }
        fdSrc = open(argv[1],O_RDWR);
        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,strlen(readBuf));
        fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
        int n_wirte = write(fdSrc,readBuf,strlen(readBuf));
        close(fdSrc);
        close(fdDes);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    编译命令如下

    gcc file16cp.c -o mycp
    ./mycp file1.c newFile.c
    
    • 1
    • 2

    这里注意 file16cp.c就是我们复刻的cp命令文件
    file1.c文件是我们打算复制的文件,newfile.c就是复制完毕的副本

    复刻cp命令的介绍就差不多了,下一篇即将是进程阶段的学习,博主近期终于回归!可以给博主一个免费的三连吗

  • 相关阅读:
    @RestControllerAdvice 统一异常处理
    BOM介绍以及应用以及this指向问题
    63从零开始学Java之时间格式化怎么实现?
    面试题-Linux优化&一些服务优化
    面向对象编程·下
    解决 for 循环中使用 var 定义函数的问题(解决循环中异步问题)
    【Java 基础篇】Java 异常处理指南:解密异常处理的关键技巧
    MySQL Linux服务器快照克隆引起的binlog日志无法正常删除导致文件系统满
    ASL和二叉排序树
    微信小程序 -- 联系客服(小程序客服)
  • 原文地址:https://blog.csdn.net/tianbutian_/article/details/125603558