cp命令IO代码实现实例

news2024/9/28 9:23:04

需求内容:

编写一个类似于cp命令的程序,当使用该程序复制一个包含空洞(连续的空字节)的普通文件时,要求目标文件的空洞与源文件保持一致。

测试一:普通文件的复制

#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sys/epoll.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d $$ " format "\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#define printable(ch) (isprint((unsigned char)ch)?ch:'#')
#define MAX_BUF  1024
int my_cp(int argc, char *argv[]){
    char buf[MAX_BUF + 1];
    for(int i = 0; i < argc; i++){
        printf("%s,",argv[i]);
    }
    printf("\n");
    if(argc < 3){
        printf("Usage: %s <src_file> <dst_file>\n");
        return 0;
    }
    char *src_file = argv[1];
    char *dst_file = argv[2];

    int fd1 = open(src_file,O_RDONLY);
    if(fd1 < 0){
        perror("open1");
        return -1;
    }
    DEBUG_INFO("open %s ok\n", src_file);
    int fd2 = open(dst_file,O_WRONLY | O_TRUNC | O_CREAT,0666);
    if(fd2 < 0){
        perror("open2");
        return -2;
    }
    DEBUG_INFO("open %s ok\n", dst_file);
    while(1){
        memset(buf,0,sizeof(buf));
        int len = read(fd1,buf,MAX_BUF);
        if(len <= 0){
            break;
        }
        write(fd2,buf,len);
    }
    DEBUG_INFO("bye bye");
    close(fd1);
    close(fd2);
    return 0;
}
int main(int argc, char *argv[])
{
    my_cp(argc,argv);
    return 0;
}

 实验

创建源文件

$ echo "hello world" > hello.txt

执行测试程序生成world.txt

./_build_/cp1 hello.txt world.txt 

读取world.txt文件内容

$ cat world.txt 
hello world

测试二:制作空洞文件

文件命名cp2.txt,制作一个带空洞的文件black_hole.txt,文件开头是字符串begin,尾巴是字符串end。中间是空洞,总计大小是100。

#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sys/epoll.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d $$ " format "\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#define printable(ch) (isprint((unsigned char)ch)?ch:'#')
#define MAX_BUF  1024

int create_black_hole_file(char *name){
    int fd = open(name,O_CREAT | O_RDWR | O_TRUNC,0666);
    if(fd < 0){
        perror("open");
        return -1;
    }
    DEBUG_INFO("open %s ok",name);
    DEBUG_INFO("cur pos:%d",lseek(fd,0,SEEK_CUR));

    write(fd,"begin",sizeof("begin"));
    DEBUG_INFO("cur pos:%d",lseek(fd,0,SEEK_CUR));

    DEBUG_INFO("%d",lseek(fd,100-sizeof("begin") - sizeof("end"),SEEK_END));
    write(fd,"end",sizeof("end"));
    DEBUG_INFO("cur pos:%d",lseek(fd,0,SEEK_CUR));

    close(fd);
    return 0;
}

int main(int argc, char *argv[])
{
    create_black_hole_file("black_hole.txt");
    return 0;
}

执行测试文件,生成black_hole.txt文件,大小是100

$ ls -lshF black_hole.txt
4.0K -rw-rw-r-- 1 lkmao lkmao 100 6月  28 15:08 black_hole.txt

复制黑洞文件并验证 

用测试1的测试程序复制这个空洞文件,看看会有什么现象。

./_build_/cp1 black_hole.txt other_black_hole.txt

如下所示:好美没啥问题,大小没错,使用diff比较一下。 

$ ls -lsh other_black_hole.txt 
4.0K -rw-rw-r-- 1 lkmao lkmao 100 6月  28 15:16 other_black_hole.txt

使用diff比较,如下所示 ,零输出,这应该是相同的意思吧

对比md5值

 复制链接文件并验证

创建一个软链接

$ ln -s black_hole.txt ln.txt
$ ls -lsh ln.txt 
0 lrwxrwxrwx 1 lkmao lkmao 14 6月  28 15:25 ln.txt -> black_hole.txt
$

 通过软链接复制:

./_build_/cp1 ln.txt other_ln.txt

查看结果: 

$ ls -lsh ln.txt other_ln.txt 
   0 lrwxrwxrwx 1 lkmao lkmao  14 6月  28 15:25 ln.txt -> black_hole.txt
4.0K -rw-rw-r-- 1 lkmao lkmao 100 6月  28 15:27 other_ln.txt

好像也没问题。 

$ md5sum other_ln.txt 
9253ef3823d27b6c854b26fe65a0aee6  other_ln.txt
$

小结

原来还以为有多难呢,真是,哎。

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

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

相关文章

升哲科技受邀出席第十四届夏季达沃斯论坛

6月27日至29日&#xff0c;第十四届夏季达沃斯论坛将在天津举办&#xff0c;国务院总理李强将出席论坛&#xff0c;并在开幕式上发表特别致辞。 升哲科技&#xff08;SENSORO&#xff09;创始人兼CEO赵武阳作为中国新生代商业领袖代表&#xff0c;受邀参加开幕式以及主论坛&am…

如何查看阿里云https账号密码

克隆git上的项目时出现身份验证&#xff0c;此时需要阿里云https密码 查看阿里云https密码&#xff1a;

事务管理秘籍:MySQL引擎的黄金法则

前言 大家在生活中肯定使用过微信或者支付宝转账吧&#xff0c;那么大家有没有想过一个问题呢&#xff1f;就是如果你向商家转账了&#xff0c;但是突然微信或者支付宝服务器出现问题了&#xff0c;商家并没有收到转账该怎么办呢&#xff1f; 今天我将来带大家了解解决这一问…

浙大GMSCM十周年庆典圆满闭幕!宁海元携易知微进行主题分享

6月24日&#xff0c;浙江大学与加拿大麦吉尔大学携手创办的全球制造与供应链管理硕士项目&#xff08;Master in Global Manufacturing and Supply Chain Management&#xff09;十周年庆典在浙江大学隆重召开。本次论坛致力于为制造业、服务业、物流业、金融业等各行业管理人员…

Java安装并使用Jmter测试微服务高并发下的服务雪崩场景

高并发会给微服务带来什么样的的问题? 在微服务架构中,我们将业务拆分成一个个的服务,服务和服务之间可以互相调用,但是由于网络原因或者自身的原因,服务并不能保证服务100%是可用的,如果单个服务出现问题,调用这个服务的时候就会出现网络延迟在系统中一直阻塞等待(阻塞就意味…

【kubernetes系列】Kubernetes之service

本章节将分享一下关于kubernetes中service的相关知识。 一、service 概述 Service也是Kubernetes里的最核心的资源对象之一&#xff0c;正是因为对此概念的支持&#xff0c;Kubernetes在某种角度下可以被看成是一种微服务平台。由于Kubernetes中的pod并不稳定&#xff0c;比…

从0到1精通自动化测试,pytest自动化测试框架,pytest分布式执行(pytest-xdist)(十六)

一、前言 平常我们手工测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟 如果一个测试人员执行需要1000分钟才能执行完&#xff0c;当项目非常紧急的时候&#xff0c;我们会用测试人力成本换取时间成本&#xff0c;这个时候多找个小伙伴把…

【技术操作】如何通过抓包来分析EasyCVR不回复上级平台的invite请求?

EasyCVR平台基于云边端协同架构&#xff0c;可支持多协议、多类型的海量设备接入与分发&#xff0c;平台既具备传统安防视频监控的能力&#xff0c;也具备接入AI智能分析的能力&#xff0c;在线下均有大量应用。 有用户反馈&#xff0c;在级联时&#xff0c;使用EasyCVR作为下级…

【2023年全新保姆级教程】解决Ubuntu文件系统磁盘空间不足low disk space on filesystem root

** 解决Ubuntu22.04文件系统磁盘空间不足low disk space on filesystem root ** 大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流…

QGIS实战操作-解决TIFF影像黑边问题

QGIS实战操作-解决TIFF影像黑边问题 问题描述 "TIFF图像黑边问题"就是当我们处理或使用TIFF格式的遥感或者地理信息数据时&#xff0c;经常会在图像边缘看到一些不该出现的黑色区域&#xff0c;这些黑边可能会影响我们对图像的观看体验&#xff0c;甚至可能对图像的…

Unity 自定义代码模板

文章目录 1. Unity 中自带的代码模板创建自己的代码模板3. 代码模板的修改4. 自定义标签 1. Unity 中自带的代码模板 在 Unity 的安装目录下找到 Unity\Editor\Data\Resources\ScriptTemplates 文件夹&#xff0c;结构如下&#xff1a; 对应上图可得出&#xff1a; 文件名后…

CSS知识点汇总(一)

介绍一下标准的 CSS 的盒子模型&#xff1f; 两种盒子模型&#xff1a;IE盒模型&#xff08;border-box&#xff09;、W3C标准盒模型&#xff08;content-box&#xff09; 盒模型&#xff1a; 分为内容(content)、填充(padding)、边界(margin)、 边框(border)四个部分&#x…

IntelliJ IDEA maven 引用本地 jar 文件

一、背景说明 由于某些特定原因&#xff0c;不能在远程maven仓库中下载所需要版本的jar文件&#xff0c;需要在maven中引用本地jar文件。 二、解决方案 1、创建 libs 目录 为了方便jar包管理&#xff0c;可以在工程目录下&#xff0c;创建一个与src目录平级的libs目录。如下…

OpenCV之Window开发环境配置

下载opencv开发包 win配置: 双击SDK包解压 解压中 解压成功 配置环境变量 验证环境 创建控制台应用并配置工程属性表添加opencv环境 创建属性表 配置属性 复制属性表并修改名Project1X64_Debug与Project1X64_Release 导入属性表 测试opencv功能 示例代码 #include <ope…

rsync安装使用

目录 一、磁盘性能测试安装fio磁盘性能测试工具测试内容为顺序读、随机读、顺序写、随机写、随机读写结果分析 二、CPU性能测试安装sysbench性能测试工具结果分析 三、内存性能测试结果分析 四、网络性能测试测试iperf3工具测试结果分析1.测试TCP吞吐量2 . 测试UDP丢包和延迟 此…

Kubernetes-Ingress、Ingress Controller、Ingress Class

概念 1.Ingress 是对K8S集群中服务的外部访问进行管理的 API 对象。Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。 2.Ingress Controller 通常负责通过负载均衡器来实现 Ingress。 3.必须拥有一个 Ingress Controller…

【已解决】如何下载使用公司内部Maven私有仓库中的依赖

文章目录 1、前言2、解决办法3、总结 1、前言 ​今天刚来公司实习&#xff0c;面对leader抛来的项目和文档&#xff0c;对于第一次实习的我&#xff0c;显然有点手足无措&#xff0c;于是就按着平时写代码的习惯。1、拉代码放本地&#xff1b;2、开始导入项目依赖&#xff1b;…

go channel 详解

一、概述 在Go语言中&#xff0c;channel是一种特殊的类型&#xff0c;用于在并发编程中实现不同的goroutine之间的通信和同步。本文将深入探讨golang的channel是如何工作的&#xff0c;并介绍如何使用channel来提高程序的性能和可靠性。 二、什么是Channel&#xff1f; 在G…

【Opencv】----- 图片无缝融合

上次写了一篇关于GAN缺陷生成的图片的&#xff0c;发现大家的对这个根本不感兴趣&#xff0c;可能是用于在座的各位觉得样本有的是&#xff0c;我为什么还苦哈哈的去生成啊&#xff0c;说的也不是没有道理&#xff0c;可能只是我搞了更加苦哈哈的工业深度学习吧&#xff0c;所以…

软件测试技能,JMeter压力测试教程,监听器之每秒事务数与响应时间(十四)

前言 压测的时候&#xff0c;我们会经常关注2个重要的指标 TPS 和 RT TPS&#xff1a;每秒处理的事务数(Transactions per Second)&#xff0c;jmeter的Throughput为吞吐量&#xff08;请求数/秒&#xff09; RT&#xff1a;响应时间(Reponse Time&#xff09;&#xff0c;从…