自己实现Linux 的 cp指令

news2024/9/23 14:36:51

cp指令

Linux的cp指令就是复制文件:

cp: 拷贝(cp 拷贝的文件 贝到的地址或文件),cp b.c test.c 将b.c拷成test.c的一个新文件

Linux 系统初识_mjmmm的博客-CSDN博客

实现思路

  1. 打开源文件
  2. 读文件内容到缓冲区
  3. 创建新文件
  4. 将读到的文件内容全部写入新文件
  5. 关闭两个文件(不能忘!)

在实现之前,要明确如何在Linux中写带参数的函数,之前都是不带参数,然后执行就是./a.out就完事了。

cp A.c B.c这个函数

  • int argc: int型的argc变量代表的是参数的个数
  • char **argv: char型的二级指针变量argv代表的是具体的参数值

小实验:

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("total param:%d\n",argc);
        printf("First param is:%s\n",argv[0]);
        printf("Second param is:%s\n",argv[1]);
        printf("Third param is:%s\n",argv[2]);

        return 0;

}

可见,这样写就可以实现带参数的函数输入,且由于argv是二级指针,所以任何一个参数还是一个单独的字符串

demo5.c: 

#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 fd1; // file description
	int fd2;
	char *buf_read;

	if(argc != 3){
		printf("lack of param!\n");
		exit(-1);
	}

	fd1 = open(argv[1],O_RDWR);
	printf("srcfile:%s\n",argv[1]);

	if(fd1 != -1){
		printf("srcfile description = %d, open successfully!\n",fd1);
	}else{
		printf("fail to copy, original file doesnt exit!\n");
		exit(-1);
	}

	int size = lseek(fd1,0,SEEK_END); //使用lseek的光标返回值计算文件的大小!!
	lseek(fd1,0,SEEK_SET); //计算完之后要将光标回到开头!!!
	buf_read = (char *)malloc(sizeof(char)*size + 1);

	int count_read = read(fd1, buf_read, size);
    if(count_read != -1){
        printf("%d bytes data has been read, context:%s\n",count_read, buf_read);
    }else{
        printf("fail to read\n");
		exit(-1);
    }

	close(fd1);
	fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC, 0600);
	printf("desfile:%s\n",argv[2]);

	if(fd2 != -1){
         printf("desfile description = %d, open successfully!\n",fd2);
    }else{
         printf("fail to open desfile\n");
         exit(-1);
    }


	int count_write = write(fd2, buf_read, strlen(buf_read));
	if(count_write != -1){
		printf("%d bytes data has been written\n",count_write);
	}else{
		printf("fail to write\n");
		exit(-1);
	}

	close(fd2);
	printf("copy completed!\n");

	return 0;
}

其中,这两句代码很重要! 

int size = lseek(fd1,0,SEEK_END); //使用lseek的光标返回值计算文件的大小!!
lseek(fd1,0,SEEK_SET); //计算完之后要将光标回到开头!!!

并且注意

fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC, 0600);

对于目标文件的打开,一定要加上O_CREAT O_TRUNC因为复制文件的时候,目标文件常常是不存在的,所以可能需要创建,而如果目标文件名已经存在,那么通常希望是将原来的数据全部删除,替换成新复制的数据,而不是单纯的覆盖,这样会导致错误。

实现效果

创建一个file1,并随便打点内容:

执行代码:

打开新的file2:

 

可见,内容和file1一摸一样,copy成功!

同时注意一个很神奇的现象,在上面代码执行的cmd截图中,源文件和目标文件的文件标识符竟然是一样的原因是我在读取源文件所有内容了之后就立刻关闭了源文件,所以之后将相同的文件标识符赋给目标文件也不会有问题。

如果将“源文件关闭”的操作留在最后进行,那么文件标识符就会不同:

另外,如果可以在gcc的时候给执行文件取名,这样实现的效果就更像cp一点:

同时,在FILE文件夹里也可以看到mycp这个执行文件:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类

目录 1.Clonable接口和深拷贝 2.抽象类和接口的区别 3.Object类 4.获取对象的信息 5.对象比较方法equals 6.内部类 1.Clonable接口和深拷贝 Java 中内置了一些很有用的接口, Clonable 就是其中之一&#xff0c;Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对…

人工智能学习07--pytorch23--目标检测:Deformable-DETR训练自己的数据集

参考 https://blog.csdn.net/qq_44808827/article/details/125326909https://blog.csdn.net/dystsp/article/details/125949720?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-125949720-blog-125326909.235^v38^pc_releva…

react中hooks的理解与使用

一、作用 我们知道react组件有两种写法一种是类组件&#xff0c;另一种是函数组件。而函数组件是无状态组件&#xff0c;如果我们要想改变组件中的状态就无法实现了。为此&#xff0c;在react16.8版本后官方推出hooks&#xff0c;用于函数组件更改状态。 二、常用API 1、use…

(Yolov5常见bug)RuntimeError: “slow_conv2d_cpu“ not implemented for ‘Half‘问题解决

今天用Yolov5目标检测模型进行Flask部署的时候&#xff0c;遇见一个问题&#xff1a;RuntimeError: "slow_conv2d_cpu" not implemented for Half。在王宏网上查阅了很久&#xff0c;发现大多数都是在讲有关Half的精度问题。 具体报错如下&#xff1a; 他人的解决方…

Git小乌龟的安装及使用

1.先下载git&#xff0c;按照相应的系统&#xff0c;https://git-scm.com/downloads&#xff0c;然后&#xff0c;一直next即可完成安装 2.安装git小乌龟&#xff0c;https://tortoisegit.org/download/&#xff0c;同样的&#xff0c;一直next即可完成安装&#xff0c;但是&a…

「从零入门推荐系统」22:chatGPT、大模型在推荐系统中的应用

作者 | gongyouliu 编辑 | gongyouliu 提示&#xff1a;全文2.5万字&#xff0c;预计阅读时长2小时&#xff0c;可以先收藏再慢慢阅读。 我们在上一章介绍了chatGPT、大模型的基本概念、核心技术原理等基础知识&#xff0c;有了这些背景知识的铺垫&#xff0c;下面我们来介绍ch…

从零开始,探索Python变量的奥秘!

在Python这个充满魔力的编程世界中&#xff0c;变量是一门必须深入了解的基础知识。无论你是初学者还是有经验的开发者&#xff0c;掌握变量的基本语法对于编写优雅、高效的代码至关重要。本篇博客将带你从零开始&#xff0c;深入探索Python变量的奥秘&#xff0c;让你在编程之…

FBX SDK开发快速上手指南

一段时间以来&#xff0c;我一直想制作一个 FBX Exporter 将 FBX 文件转换为我自己的格式。 整个过程不是很顺利&#xff0c;主要是FBX的官方文档不是很清楚。 另外&#xff0c;由于 FBX 格式被许多应用程序使用&#xff0c;而不仅仅是游戏引擎&#xff0c;因此提供的示例代码没…

Linux操作系统~Linux基础知识相关题

整卷阅览&#xff1a; 想要获取试卷原版请点击以下链接下载&#xff1a; https://download.csdn.net/download/qq_53142796/88168132https://download.csdn.net/download/qq_53142796/88168132 解题过程&#xff1a; 选择题&#xff08;每小题2分&#xff0c;共30分&#xff…

【设计模式】-建造者模式

Java建造者模式&#xff1a;创建复杂对象的灵活构建者 在软件开发中&#xff0c;我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建&#xff0c;可能会导致构造函数参数过多&#xff0c;难以管理和维护。建造者模式&#xff08;Builder Pattern&am…

FFmpeg中硬解码后深度学习模型的图像处理dnn_processing(一)

ffmpeg 硬件解码 ffmpeg硬件解码可以使用最新的vulkan来做&#xff0c;基本上来说&#xff0c;不挑操作系统是比较重要的&#xff0c;如果直接使用cuda也是非常好的选择。 AVPixelFormat sourcepf AV_PIX_FMT_NV12;// AV_PIX_FMT_NV12;// AV_PIX_FMT_YUV420P;AVPixelFormat d…

Linux-centos花生壳实现内网穿透

Linux-centos花生壳实现内网穿透 官网教程 1.安装花生壳 下载网址 点击复制就可以复制下载命令了 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm# 下载完成之后会多一个rpm文件 [rootlocalhost HuaSheng]# ls phddns_…

UE5+Paperzd问题

TopDown的2D游戏&#xff0c;遇到两个问题&#xff0c;第一问题是游戏一开始就会从tilemap上掉下去。第二个问题是没法和图层2上的物体做碰撞。 一、碰撞问题 1、创建的TileSet后&#xff0c;左侧选中一个tile后&#xff0c;一定要点击上边的Add Box&#xff0c;否则创建出来的…

jenkins的cicd操作

cicd概念 持续集成&#xff08; Continuous Integration&#xff09; 持续频繁的&#xff08;每天多次&#xff09;将本地代码“集成”到主干分支&#xff0c;并保证主干分支可用 持续交付&#xff08;Continuous Delivery&#xff09; 是持续集成的下一步&#xff0c;持续…

Julia 字典和集合

数组是一种集合&#xff0c;此外 Julia 也有其他类型的集合&#xff0c;比如字典和 set&#xff08;无序集合列表&#xff09;。 字典 字典是一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用 > 分割&#xff0c;每个键值对之间用逗…

STM32的电动自行车信息采集上报系统(学习)

摘要 针对电动自行车实时监管不便的问题&#xff0c;设计了一种基于STM32的电动自行车信息采集系统&#xff0c;通过获取电池、位置和行驶状态信息并上报到服务器中&#xff0c;实现实时监管。 通过多路串口请求电池、行驶状态和位置信息&#xff0c;以并发方式进行数据接收、…

亿欧智库:2023中国宠物行业新趋势洞察报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 户外赛道本质上迎合了全球共性需求的增长&#xff0c;从养宠意愿的转化到养宠生活的需求&#xff0c;多层次的需求推动行业发展新趋势 从需求端进行分析&#xff0c;可以将养宠意愿的转化分为三个层…

nginx部署以及反向代理多域名实现HTTPS访问

nginx部署以及反向代理多域名实现 1.nginx部署 1.1 编写nginx部署文件 docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx-mainports:- 80:80- 443:443volumes: # 基础配置- /opt/nginx_main/nginx-info/nginx.conf:/…

并查集模板-两个操作:合并集合和查询两个元素是否属于同一个集合

一、链接 836. 合并集合 二、题目 一共有 nn 个数&#xff0c;编号是 1∼n1∼n&#xff0c;最开始每个数各自在一个集合中。 现在要进行 mm 个操作&#xff0c;操作共有两种&#xff1a; M a b&#xff0c;将编号为 aa 和 bb 的两个数所在的集合合并&#xff0c;如果两个数…

在 aosp 中启用 Material You design

作者&#xff1a;Mr_万能胶 近期研究了一下如何在 aosp 中启用 Material You design&#xff0c;在把踩过的坑记录一下&#xff0c;方便后续有厂商可以快速集成。 本文基于 aosp 最新代码&#xff0c;版本号为 Android 13&#xff0c;并使用 Cuttlefish 快速验证。 Material …