8.21作业

2023-11-12

双线程拷贝

#include<myhead.h>
typedef struct
{
    const char *src;  // argv[1]
    const char *dst; // argv[1]
    int start;        //光标开始位置
    int len;          //需要向后读取个数
}Node;

//计算要拷贝文件字符个数
int getlen(const char *srcfile, const char *dstfile)
{
    int fd1, fd2;
    int len = 0;

    //只读打开源文件
    if ((fd1 = open(srcfile, O_RDONLY)) == -1)
    { 
        printf("open srcfile error");
    }

    //只写打开目标文件
    if ((fd2 = open(dstfile, O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1)
    {
        
        printf("open dstfile error");
    }

    //读取目标要拷贝的文件的字节数
    len = lseek(fd1, 0, SEEK_END);

    close(fd1); //关闭文件
    close(fd2);

    return len;
}

//双线程拷贝文件
int copy_file(const char *srcfile, const char *dstfile, int start, int len)
{
    int fd1, fd2;
    char buf[128] = {0};   //临时存放数组
    int ret = 0;

    //记录已经读取字节数
    int sum = 0;

    //打开目标要拷贝的文件
    if ((fd1 = open(srcfile, O_RDONLY)) == -1)
    { 
        printf("open srcfile error");
    }

    //打开存放拷贝的文件
    if ((fd2 = open(dstfile, O_WRONLY)) == -1)
    { 
        printf("open dstfile error");
    }
    //光标从头开始,移动start
    lseek(fd1, start, SEEK_SET);
    lseek(fd2, start, SEEK_SET);

    while (1)
    {
        ret = read(fd1, buf, sizeof(buf));

        sum += ret; //记录已经读取字节数
        //结尾||读多了
        if (ret == 0 || sum > len)
        {
            write(fd2, buf, ret - (sum - len));
            break;
        }
        write(fd2, buf, ret);
    }
    close(fd1);
    close(fd2);
    return 0;
}


//线程体函数
void *task(void *arg)
{
    Node data = *(Node *)arg;

    /*双线程拷贝文件*/
    copy_file(data.src, data.dst, data.start, data.len);
    pthread_exit(NULL); //退出线程
}

int main(int argc, const char *argv[])
{
    
    if (argc != 3)
    {
     
        fprintf(stderr, "input error,try again\n");
        fprintf(stderr, "usage:./a.out srcfile,destfile\n");
        return -1;
    }
  
    int len= getlen(argv[1], argv[2]);

    //结构体赋值
    Node data[] = {
        {argv[1], argv[2], 0, len / 2},
        {argv[1], argv[2], len / 2, (len - len / 2)},
    };


    //新建子线程
    pthread_t tid1, tid2; 
    if (pthread_create(&tid1, NULL, task, (void *)&data[0]))
        printf("thread 1 create error");

    if (pthread_create(&tid2, NULL, task, (void *)&data[1]))
        printf("thread 2 create error");

	//回收
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    return 0;
}

三线程拷贝

#include<myhead.h>
typedef struct
{
    const char *src;  // argv[1]
    const char *dst; // argv[1]
    int start;        //光标开始位置
    int len;          //需要向后读取个数
}Node;

//计算要拷贝文件字符个数
int getlen(const char *srcfile, const char *dstfile)
{
    int fd1,fd2;
    int len = 0;

    //只读打开源文件
    if ((fd1 = open(srcfile, O_RDONLY)) == -1)
    { 
        printf("open srcfile error");
    }

    //只写打开目标文件
    if ((fd2 = open(dstfile, O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1)
    {
        
        printf("open dstfile error");
    }

    //读取目标要拷贝的文件的字节数
    len = lseek(fd1, 0, SEEK_END);

    close(fd1); //关闭文件
    close(fd2);

    return len;
}

//三线程拷贝文件
int copy_file(const char *srcfile, const char *dstfile, int start, int len)
{
    int fd1,fd2;
    char buf[128] = {0};   //临时存放数组
    int ret = 0;

    //记录已经读取字节数
    int sum = 0;

    //打开目标要拷贝的文件
    if ((fd1 = open(srcfile, O_RDONLY)) == -1)
    { //只读
        printf("open srcfile error");
    }
    //打开存放拷贝的文件
    if ((fd2 = open(dstfile, O_WRONLY)) == -1)
    { //读写
        printf("open dstfile error");
    }
    //光标从头开始,移动start
    lseek(fd1, start, SEEK_SET);
    lseek(fd2, start, SEEK_SET);

    while (1)
    {
        ret = read(fd1, buf, sizeof(buf));

        sum += ret; //记录已经读取字节数
        //结尾||读多了
        if (ret == 0 || sum > len)
        {
            write(fd2, buf, ret - (sum - len));
            break;
        }
        write(fd2, buf, ret);
    }
    close(fd1);
    close(fd2);
    return 0;
}


//线程体函数
void *task(void *arg)
{
    Node data = *(Node *)arg;

    /*三线程拷贝文件*/
    copy_file(data.src, data.dst, data.start, data.len);
    pthread_exit(NULL); //退出线程
}

int main(int argc, const char *argv[])
{
    
    if (argc != 3)
    {
     
        fprintf(stderr, "input error,try again\n");
        fprintf(stderr, "usage:./a.out srcfile,destfile\n");
        return -1;
    }
  
    int len= getlen(argv[1], argv[2]);

    //结构体赋值
    Node data[] = {
        {argv[1], argv[2], 0, len/3},
        {argv[1], argv[2], len/3, len*2/3},
		{argv[1], argv[2], len*2/3,len-len*2/3}
    };


    //新建子线程
    pthread_t tid1, tid2, tid3; 
    if (pthread_create(&tid1, NULL, task, (void *)&data[0]))
	   { 
		   printf("pthread_create error\n");
	   }

    if (pthread_create(&tid2, NULL, task, (void *)&data[1]))
        { 
			printf("pthread_create error\n");
		}

	if (pthread_create(&tid3, NULL, task, (void *)&data[2]))
	   {
	        printf("pthread_create error\n");
	   }

	//回收
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
	pthread_join(tid3, NULL);

    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8.21作业 的相关文章

  • 已解决 java lang NullPointerException Attempt to invoke vir

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 今天开发的时候 发现明明有这个id 而且也通过find
  • 【微信】PC端多开设置

    文章目录 背景 步骤 查找微信安装路径 编写 bat启动脚本 自定你快捷键图标 创建快捷方式 修改图标 背景 个人喜欢工作和生活分离 包括手机号和微信都是生活号和工作号两个 快速区分生活还是工作信息或电话 不会错过重要的信息 微信朋友圈信息

随机推荐

  • 盘点2020年科技领域预测~堪称大型翻车现场!

    2020年曾经是很多人幻想的一年 如今这一年真正已经到来 让我们回顾一下科技行业对2020年预测 是否已经实现 优步将部署飞行汽车 优步公司曾承诺3年时间推出飞行汽车 2020年该公司将会举行飞行汽车的演示 但是可以肯定的是 明年你无法使用
  • Python 打印三位所有水仙花数

    打印三位水仙花数 介绍 水仙花数是一个三位数 它的每位数字的3次幂之和等于它本身 例如 153 1 3 5 3 3 3 知识点 1 算术运算符 幂 符号 整除 符号 取余 符号 2 if 条件语句 3 for 循环 预先打印文字 print
  • Make-A-Video - Pytorch (wip) text to video

    制作视频 Pytorch wip Make A Video的实现 新的 SOTA 文本到来自 Meta AI 的视频生成器 在 Pytorch 中 它们结合了伪 3d 卷积 轴向卷积 和时间注意力 并显示出更好的时间融合 伪 3d 卷积并不
  • linux问题记录

    panic stack over 线程栈过小 syslog占用栈 导致栈溢出
  • Word doc/docx 格式文件转换为 MarkDown

    异想之旅 本人原创博客完全手敲 绝对非搬运 全网不可能有重复 本人无团队 仅为技术爱好者进行分享 所有内容不牵扯广告 本人所有文章仅在CSDN 掘金和个人博客 一定是异想之旅域名 发布 除此之外全部是盗文 今天忽然想要把自己的 资源分享文章
  • vc 识别移动硬盘 U盘,本地硬盘

    说明 有时候我们在做设备监控的时候 要识别一些链接设备 在使用函数GetDriveType的时候 U盘可以返回DRIVE REMOVABLE 而本地硬盘硬盘和移动硬盘DRIVE FIXED 因此还需要进一步来识别 识别方法为判断设备的总线类
  • 浅谈 SOLID 原则的具体使用

    单一职责原则 SRP 开放封闭原则 OCP 里氏替换原则 LSP 接口隔离原则 ISP 依赖倒置原则 DIP 小结 SOLID 是面向对象设计5大重要原则的首字母缩写 当我们设计类和模块时 遵守 SOLID 原则可以让软件更加健壮和稳定 那
  • 物理机重启后ES无法访问

    问题 机房断电 重启机器后 Elasticsearch 集群无法访问 集群状态访问如下 可以访问 9200 端口 目测 Elasticsearch 是正常的 但是查看集群状态报错 报错内容 error root cause type mas
  • Python 实现简单的自定义异常类型

    usr bin env python import os socket errno types tempfile class NetworkError IOError pass class FileError IOError pass de
  • threadx系统_小熊派带你初探最近叱咤风云的ThreadX全家桶

    一 前言 1 1 ThreadX操作系统简介 去年微软宣布收购ThreadX 但是没有公布后续策略 uCOS全家桶进入开源免费后 ThreadX也宣布正式加入 微软未来四年将投资50亿美元到物联网上 收购Express Logic是该战略的
  • 取代 C++,Google 强势开源 Carbon语言

    整理 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews 每一种编程语言都曾想一统江湖 将其他语言取而代之 但事实上 能够在众多竞争者中脱颖而出并雄霸一方天地并非易事 今天 谷歌重磅公开了其内部建立的最新编程语言 Carbon 剑指
  • 神经风格迁移——基于VGG算法

    本文是基于吴恩达 深度学习 卷积神经网络第四周习题而做 神经风格迁移的效果是将A图片的某些特征迁移到B图中 使B图具有与之相同的风格 具体的讲解可以观看达叔 深度学习 教程 所需的第三方库如下 其中所用的数据集和辅助程序可点击此处下载 im
  • CSSS样式穿透

    在使用 CSS 样式时 有时候我们希望修改子组件中的样式 但是由于 CSS 的层叠规则 子组件的样式可能会被父组件的样式所覆盖 这时可以使用 CSS 样式穿透 CSS style piercing 来解决这个问题 CSDN上面大多数都是使用
  • 体积

    题目描述 问题描述 给出 n 件物品 每件物品有一个体积 V i 求从中取出若干件物品能够组成的不同的体积和有多少种可能 输入格式 第 1 行 1 个正整数 表示 n 第 2 行 n 个正整数 表示 V i 每两个数之间用一个空格隔开 输出
  • 8-窗口、窗口控件、对话框以及相关功能类-对话框QDialog

    对话框QDialog 对话框 QDialog 是顶层窗口 主要用于短期任务和与用户的简短通信 所谓的顶层窗口 就是可以显示在所有窗口的最前面 也有另一种说法 是指没有父类的窗口 例如 有些警告窗口始终显示在屏幕顶端 直到被用户关闭 QDia
  • java中yield(),sleep()以及wait()的区别

    往往混淆了这三个函数的使用 从操作系统的角度讲 os会维护一个ready queue 就绪的线程队列 队列 是先进先出的 FIFO 并且在某一时刻cpu只为ready queue中位于队列头部的线程服务 但是当前正在被服务的线程可能觉得cp
  • 微信 history.back 时候的 缓存问题处理, 最近搞得我很头疼

    最近在写微信的项目 遇到一个很坑爹的问题 为了更好的用户体验 我希望在项目中 点击返回按键的时候能返回到 某一个指定的页面 返回某些页面的时候页面不缓存 jsp 页面缓存 src 请求缓存 ajax 请求缓存 主要操作的 api 有 pop
  • Ubuntu安装deepin-wine并安装微信

    安装deepin wine 只需要简简单单的三个命令 git clone https gitee com wszqkzqk deepin wine for ubuntu git cd deepin wine for ubuntu insta
  • mysql之union合并查询

    转载链接 http www cnblogs com zzwlovegfj archive 2012 06 23 2559592 html union 联合的意思 即把两次或多次查询结果合并起来 要求 两次查询的列数必须一致 推荐 列的类型可
  • 8.21作业

    双线程拷贝 include