自己实现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 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这个执行文件:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在家下载Springer、IEEE、ScienceDirect等数据库论文的论文下载工具

Springer、IEEE、ScienceDirec数据库是我们查找外文文献常用数据库&#xff0c;当我们没有数据库使用权限的时该如何下载这些数据库的学术论文呢&#xff1f;下面就讲解一下在家下载数据库学术文献的论文下载工具。 一、查找下载外文文献&#xff0c;我们可以谷歌学术检索&…

LeetCode-Java(05)

19. 删除链表的倒数第 N 个结点 两个方法&#xff0c;方法一是先走一遍链表得出链表长度&#xff0c;再走第二遍&#xff0c;找到倒数第n个数。方法二是双指针&#xff0c;首先快指针就比慢指针多走n步&#xff0c;然后这俩指针同步走&#xff0c;快指针走到头了&#xff0c;慢…

python-Excel数据模型文档转为MySQL数据库建表语句(需要连接数据库)-工作小记

将指定Excel文档转为create table 建表语句。该脚本适用于单一且简单的建表语句 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 17:50 # Author: 水兵没月 # File : excel_2_mysql建表语句.py import reimport pandas as pd import mysql.connectordb 库名mydb m…

List集合的对象传输的两种方式

说明&#xff1a;在一些特定的情况&#xff0c;我们需要把对象中的List集合属性存入到数据库中&#xff0c;之后把该字段取出来转为List集合的对象使用&#xff08;如下图&#xff09; 自定义对象 public class User implements Serializable {/*** ID*/private Integer id;/*…

python编写小程序有界面,python编写小程序的运行

大家好&#xff0c;小编为大家解答python编写小程序怎么看代码的的问题。很多人还不知道python编写小程序的运行&#xff0c;现在让我们一起来看看吧&#xff01; Python第一个简单的小游戏 temp input("请猜一猜姐姐的幸运数字是&#xff1a; ") guess int(temp) …

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

蓝桥杯上岸每日N题第八期(全球变暖)&#xff01;&#xff01;&#xff01; 同步收录 &#x1f447; 蓝桥杯上岸必背&#xff01;&#xff01;&#xff01;(第五期BFS) 大家好 我是寸铁&#x1f4aa; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &am…

Python(六十八)元组的创建方式

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

.Net6 Web Core API 配置 Autofac 封装 --- 依赖注入

目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取程序集注入方法, 单个依赖注入, 也适用, 可<依赖注入>的地方配置 一、NuGet 包导入 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy 二、Auto…

AIDL与HIDL核心概念

目录 一. 概述 二. 核心流程的核心理解 三. 一些术语 四. 参考样例 一. 概述 AIDL和HIDL都是主要用于跨进程通信&#xff0c;本质是Binder通信。 总体流程都是先写.aidl文件或.hal文件&#xff0c;这个文件只有接口定义哦不是实现&#xff0c;然后利用工具自动生成代码&a…

kafka 理论知识

1 首先要了解kafka是什么 Kafka是一个分布式的消息订阅系统 1.1 kafka存储消息的过程 消息被持久化到一个topic中&#xff0c;topic是按照“主题名-分区”存储的&#xff0c;一个topic可以分为多个partition&#xff0c;在parition(分区)内的每条消息都有一个有序的id号&am…

【修正-高斯拉普拉斯滤波器-用于平滑和去噪】基于修正高斯滤波拉普拉斯地震到达时间自动检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

unraid docker桥接模式打不开页面,主机模式正常

unraid 80x86版filebrowser&#xff0c;一次掉电后&#xff0c;重启出现权限问题&#xff0c;而且filebrowser的核显驱动不支持amd的VA-API 因为用不上核显驱动&#xff0c;解压缩功能也用不上&#xff0c;官方版本的filebrowser还小巧一些&#xff0c;18m左右 安装的时候总是…

第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增

文章目录 多源汇最短路&#xff1a;1125. 牛的旅行传递闭包&#xff1a;343. 排序最小环&#xff1a;344. 观光之旅345. 牛站 flody的四个应用&#xff1a; 多源汇最短路传递闭包找最小环恰好经过k条边的最短路 倍增 多源汇最短路&#xff1a;1125. 牛的旅行 1125. 牛的旅行 …

数学建模—多元线性回归分析

第一部分&#xff1a;回归分析的介绍 定义&#xff1a;回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的人数就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释…

医疗知识图谱问答 ——Neo4j 基本操作

前言 说到问答机器人&#xff0c;就不得不说一下 ChatGPT 啦。一个预训练的大预言模型&#xff0c;只要是人类范畴内的知识&#xff0c;似乎他回答得都井井有条&#xff0c;从写文章到写代码&#xff0c;再到解决零散琐碎的问题&#xff0c;不光震撼到我们普通人&#xff0c;就…

本地 shell无法连接centos 7 ?

1、首先检查是否安装ssh服务&#xff1b; yum list installed | grep openssh-server# 没有安装尝试安装下 yum install openssh-server 2、检查ssh服务是否开启 systemctl status sshd.service# 未开启&#xff0c;开启下 systemctl start sshd.service # 将sshd 服务添…

MySQL多表查询 (超详细)

一、多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种: 一对多&#xff0…

类与对象【中】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;类的默认6个成员函数&#x1f449;&#x1f3fb;构造…

常用HTML标签大全

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 文章目录 一.HTML介绍二.HTML使用2.1.…

Ubuntu 23.04 作为系统盘的体验和使用感受

1.为啥主系统装了Ubuntu 由于公司发电脑了&#xff0c;我自己也有一台台式电脑&#xff0c;然后也想去折腾一下Ubuntu&#xff0c;就把自己的笔记本装成Ubuntu系统了&#xff0c; 我使用的是23.04的桌面版&#xff0c;带图形化界面的。我准备换回Windows 11了&#xff08;因为…