文件编程练手 [1] —— 编码实现系统自带指令cp

原创首发于CSDN,文章转载请注明出处,加上原文链接,谢谢!
https://blog.csdn.net/weixin_46959681/article/details/112156151



主函数main参数打印

在主函数 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.c 含有五个字符元素的数组, argv[2] 也对应 des.c 含有五个字符元素的数组。

对以上内容进行编程检测,源代码如下:test1.c

/* test1.c */
#include <stdio.h>

int main(int argc, char **argv)
{
    
    
        printf("Total params: %d\n", argc);
        printf("No.1 params: %s\n", argv[0]);
        printf("No.2 params: %s\n", argv[1]);
        printf("No.3 params: %s\n", argv[2]);
        return 0;
}

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

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


指令cp实现思路详解

  1. 明确C语言的参数 argc、argv;
  2. 打开源文件src.c
  3. 读取src.c的数据到文件缓冲区Buf;
  4. 创建目标文件des.c
  5. 将文件缓冲区Buf内的数据写入目标文件内;
  6. 关闭 close 两个文件。

|系统指令 cp 的代码实现 mycp.c

编译文件 mycp.c 生成执行文件 mycp

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

int main(int argc, char **argv)
{
    
    
		//源文件、目标文件。
        int fdSrc;
        int fdDes;
		char *readBuf = NULL;
		
		if(argc != 3){
    
    
                printf("params error.\n");
                exit(-1);
        }
        
        fdSrc = open(argv[1], O_RDWR);
        if(fdSrc == -1){
    
    
				printf("Source file opened fial.\n");
				exit(-1);
		}
        
        //使用光标进行文件内容字节数的读取统计。
        int filesize = lseek(fdSrc, 0, SEEK_END);
        //光标复位。
        lseek(fdSrc, 0, SEEK_SET);
		
		//读取数据进入readBuf
        readBuf = (char *)malloc(sizeof(char)*filesize + 8);
        read(fdSrc, readBuf, filesize);
		
		//若无目标文件则创建(O_CREAT)并覆盖(O_TRUNC)其数据内容。
        fdDes = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0600);
        if(fdDes == -1){
    
    
				printf("Destinative file opened fail.\n");
		}
		//将数据写入目标文件。
        write(fdDes, readBuf, strlen(readBuf));

		free(readBuf); 
        close(fdSrc);
        close(fdDes);
        return 0;
}	

运行生成的文件 mycp,使用文件 demo15.c 作为源文件。
demo15.c

在这里插入图片描述

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

在这里插入图片描述


文章更新记录

  • 文章第一次成文。 「2021.1.3 22:46」
  • 重新上传了第一张图片。 「2021.1.4 10:31」
  • 修改了部分内容。 「2021.1.8 20:15」
  • 修改文章标题。 「2021.1.18 15:41」
  • 独立出了第一节内容。 「2021.3.17 21:29」
  • 修改错别字。 「2021.3.18 9:50」

猜你喜欢

转载自blog.csdn.net/weixin_46959681/article/details/112156151