自己实现Linux 的 cp指令

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 descriptionint 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.rhkb.cn/news/80526.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TEMU美国儿童文具亚马逊CPC测试标准

美国站儿童文具类上架跨境电商平台美国站或者出口美国需要提交CPC认证&#xff0c;才能进入美国市场&#xff0c;由CPSC 认可的实验室出具的检测报告&#xff0c;确认每件商品均已过检测&#xff0c;符合上述适用要求。但许多亚马逊卖家反映&#xff1a;在亚马逊卖的文具类产品…

基于Java+SpringBoot制作一个智能用电小程序

在当今快节奏的生活中,高效利用能源变得越来越重要。制作一个智能用电小程序,旨在帮助您更智能地管理家庭电器的用电,从而提升能源利用效率,助您掌握用电情况,降低能耗成本,实现绿色低碳生活。 目录 一、小程序1.1 项目创建1.2 首页轮播图快捷导航iconfont图标引入

Spring Boot通过切面实现方法耗时情况

Spring Boot通过切面实现方法耗时情况 依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency>自定义注解 package com.geekmice.springbootself…

Interface 中 的 default 方法、static方法

Interface 中 的 default 方法、static方法 来源示例 之前学习/工作中一直没特别注意过Interface 中 的 default 方法、static方法,一早上来偶然看见做以记录。 来源 在 JDK1.8 时&#xff0c;接口中添加了 default 关键字和 static 关键字修饰的方法。defalut 修饰的方法标注…

5G用户逼近7亿,5G发展迈入下半场!

尽管普遍认为5G投资高峰期正在过去&#xff0c;但是从2023年上半年的情况来看&#xff0c;我国5G建设仍在衔枚疾走。 近日举行2023年上半年工业和信息化发展情况新闻发布会上&#xff0c;工信部人士透露&#xff0c;截至今年6月底&#xff0c;我国5G基站累计达到293.7万个&…

阿里云官方关于数据安全保护的声明

“阿里云监控用户的数据流量&#xff1f;”“真的假的&#xff1f;”随着近日早晨 朱峰肥鹅旅行 对阿里云的一条朋友圈截图传遍了整个IT圈。 对于网络上的各种传播&#xff0c;以下是阿里云的官方答复&#xff0c;原文如下&#xff1a; 关于数据安全保护的声明 今天有客户反映…

【Docker】性能测试监控平台搭建:InfluxDB+Grafana+Jmeter+cAdvisor

前言 在做性能测试时&#xff0c;如果有一个性能测试结果实时展示的页面&#xff0c;可以极大的提高我们对系统性能表现的掌握程度&#xff0c;进而提高我们的测试效率。但是我们每次打开Jmeter都会有几个硕大的字提示别用GUI模式进行负载测试&#xff0c;而且它自带的监视器效…

uniapp微信小程序底部弹窗自定义组件

基础弹窗效果组件 <template><view><viewclass"tui-actionsheet-class tui-actionsheet":class"[show ? tui-actionsheet-show : ]"><view class"regional-selection">底部弹窗</view></view><!-- 遮罩…

2023-08-07 LeetCode每日一题(反转字符串)

2023-08-07每日一题 一、题目编号 344. 反转字符串二、题目链接 点击跳转到题目位置 三、题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、…

Jmeter 压测工具使用手册[详细]

1. jemter 简介 jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须先…

自动配置要点解读

目录 要点1&#xff1a;什么是自动配置&#xff1f; 要点2&#xff1a;配置文件与默认配置 要点3&#xff1a;自动配置设置思想来源 要点4&#xff1a;spring.factories文件作用 要点5&#xff1a;自动配置的核心 本文只对自动配置的思想进行基本的解读&#xff0c;不涉…

【深度学习中的批量归一化BN和层归一化LN】BN层(Batch Normalization)和LN层(Layer Normalization)的区别

文章目录 1、概述2、BN层3、LN层4、Pytorch的实现5、BN层和LN层的对比 1、概述 归一化(Normalization) 方法&#xff1a;指的是把不同维度的特征&#xff08;例如序列特征或者图像的特征图等&#xff09;转换为相同或相似的尺度范围内的方法&#xff0c;比如把数据特征映射到[…

(论文复现)DeepAnt模型复现及应用

DeepAnt论文如下&#xff0c;其主要是用于时间序列的无监督粗差探测。 其提出的模型架构如下&#xff1a; 该文提出了一个无监督的时间序列粗差探测模型&#xff0c;其主要有预测模块和探测模块组成&#xff0c;其中预测模块的网络结构如下。 预测结构是将时间序列数据组…

element-ui表格数据为空,图片占位提示

当表格的绑定数据为空时常需要显示暂无数据等字样&#xff0c;这时候就用到了empty-text <el-table:data"tableData"stripeborderempty-text"暂无数据"> 但&#xff0c;当数据为空&#xff0c;想用图片展示呢&#xff0c;如下图 方法一&#xff1a…

STM32 低功耗-停止模式

STM32 停止模式 文章目录 STM32 停止模式第1章 低功耗模式简介第2章 停止模式简介2.1 进入停止模式2.1 退出停止模式 第3章 停止模式程序部分总结 第1章 低功耗模式简介 在 STM32 的正常工作中&#xff0c;具有四种工作模式&#xff1a;运行、睡眠、停止以及待机模式。 在系统…

jupyter lab环境配置

1.jupyterlab 使用虚拟环境 conda install ipykernelpython -m ipykernel install --user --name tf --display-name "tf" #例&#xff1a;环境名称tf2. jupyter lab kernel管理 show kernel list jupyter kernelspec listremove kernel jupyter kernelspec re…

APP外包开发的开发语言对比

在开发iOS APP时有两种语言可以选择&#xff0c;Swift&#xff08;Swift Programming Language&#xff09;和 Objective-C&#xff08;Objective-C Programming Language&#xff09;&#xff0c;它们是两种不同的编程语言&#xff0c;都被用于iOS和macOS等苹果平台的软件开发…

解决Vue3 使用Element-Plus导航刷新active高亮消失

解决Vue3 使用Element-Plus导航刷新后active高亮消失的问题 启用路由模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 接下来打印一下选中项index和index路径&#xff0c; 刷新也是没有任何问题的&#xff0c;active不会消失…

.net几行代码音乐API各排行榜 热搜 入库

对比了几家大厂的音乐API的接口 这家相对规范些 现在开始从零开始 net6敏捷开发对接 入库吧 关键技术工具和思维 1 json 生成类 2 分析类 规划表设计3 sqlsuger codefirst 生成表 4 封装get post 连接5 类映射automapper6 sqlsuger 插入数据 1 json 生成类 宇宙 第 一的…

LeetCode150道面试经典题-合并两个有序数组(简单)

合并两个有序数组 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&a…