坐牢第二十一天 20240801(IO)

news2025/1/9 1:55:49

一.作业

1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源

#include <myhead.h>
struct Node
{
    char *src;
    char *dest;
    int start;
    int len;
};
//定义求源文件大小的函数
int lenmain(const char*src,const char *dest)
{
    //以只读的形式打开源文件
    int fd1 = open(src,O_RDONLY);
    if(fd1==-1)
    {
        perror("open src error");
        return -1;
    }
    //以创建的形式打开目标文件
    int fd2 = open(dest,O_WRONLY|O_CREAT|O_TRUNC, 0664);
    if(fd2==-1)
    {
        perror("open dest error");
        return -1;
    }
    int size = lseek(fd1, 0, SEEK_END);
    //关闭文件
    close(fd1);
    close(fd2);
    return size;     //将文件大小返回
}
//定义文件拷贝函数
void kaobei(const char*src,const char *dest,int start,int len)
{
    //以只读的形式打开源文件
    int fd1 = open(src,O_RDONLY);
    if(fd1 == -1)
    {
        perror("open src error");
        return ;
    }
    //以创建的形式打开目标文件
    int fd2 = open(dest,O_WRONLY);
    if(fd2 == -1)
    {
        perror("open dest error");
        return ;
    }
    //移动光标位置
    lseek(fd1, start, SEEK_SET);
    lseek(fd2, start, SEEK_SET);
    //定义搬运工
    char buf[128] = "";
    int sum = 0;           //记录拷贝的总个数
    while(1)
    {
        //从源文件中读取数据
        int res = read(fd1,buf,sizeof(buf));
        sum+=res;//将读取的个数累加
        if(res==0||sum>len)//表示文件读取结束
        {
            write(fd2,buf,res-(sum-len));  
            break;
        }
        //写入到目标文件中
        write(fd2, buf, res);
    }
    //关闭文件
    close(fd1);
    close(fd2);
    printf("拷贝成功\n");
}
//创建分支线程
void *task(void *arg)
{
    struct Node node=*(struct Node*)arg;
    kaobei(node.src,node.dest,node.start,node.len);
    pthread_exit(NULL);//退出当前线程
}
/*************主函数****************/
int main(int argc, char*argv[])
{
     //判断是否传入两个文件
    if(argc != 3)
    {
        printf("input file error\n");
        return -1;
    }
    int len=lenmain(argv[1],argv[2]);
    //定义创建两个线程
    pthread_t tid1,tid2;
    struct Node node1 ={argv[1],argv[2],0,len/2};
    struct Node node2 ={argv[1],argv[2],len/2,len-len/2};
    if (pthread_create(&tid1,NULL,task,&node1)!=0)
    {
        printf("tid1创建失败\n");
        return -1;
    }
    if (pthread_create(&tid2,NULL,task,&node2)!=0)
    {
        printf("tid2创建失败\n");
        return -1;
    }
    //阻塞等待线程的结束
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    return 0;
}

二.思维导图

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

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

相关文章

python爬虫初识

一、什么互联网 互联网&#xff08;Internet&#xff09;是全球范围内最大的计算机网络&#xff0c;它将数以百万计的私人、公共、学术、商业和政府网络通过一系列标准通信协议&#xff08;如TCP/IP&#xff09;连接起来形成的一个庞大的国际网络。 互联网的起源可以追溯到196…

【C++】1.C++入门(1)

文章目录 1.C关键字2.命名空间2.1 命名空间定义2.2 命名空间使用 3.C输入&输出4.缺省参数4.1 缺省参数概念4.2 缺省参数分类 5.函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling) 1.C关键字 C总计63个关键字&#xff0c;C语言32个关键字 2.命名空…

0206创建场景状态的基础接口

一、创建一个类 二、写一个类&#xff0c;作为接口类的作用&#xff08;不一定是interface&#xff09;

ctfshow 大赛原题 web689--web695

web689 <?php error_reporting(0); if(isset($_GET) && !empty($_GET)){$url $_GET[file];$path "upload/".$_GET[path];}else{show_source(__FILE__);exit(); }if(strpos($path,..) > -1){ //检查 $path 是否包含 ..&#xff0c;以防止路径注…

Podman 发布 v5.2.0-RC3

这是 v5.2.0 的最终候选版本。以下是初步的发布说明。 功能 Podman 现在支持使用 libkrun 作为在 MacOS 上创建虚拟机的后端。libkrun 后端的优势在于允许将 GPU 挂载到虚拟机中以加速任务。默认后端仍然是 applehv。Quadlet 现在支持.build 文件&#xff0c;这使得可以由 Quad…

2024PDF编辑工具新趋势:从基础到高级的全方位方案

随着数字化办公的发展&#xff0c;我们对PDF编辑的需求也日益增长。从最开始对文字的修改到现在可以插入音频、视频文件。这些都离不开PDF编辑软件的功劳&#xff0c;那有什么好用的PDF编辑工具呢&#xff0c;听我娓娓道来。 1.福昕PDF编辑器 直达链接&#xff1a;https://e…

【轨物方案】分布式光伏电站运维智能化升级方案

分布式光伏电站从2010年开始在国内推广&#xff0c;到2022年底&#xff0c;全国工商业分布式光伏电站装机容量为157.62GW&#xff0c;并且新增装机量逐年递增。以1MW/电站计算&#xff0c;保守估计全国至少已有十几万个工商业分布式光伏电站。 这些电站的运维工作是往往交给专业…

百度松果菁英班作业整理(第一期)

本期的题目比较简单&#xff0c;最后两题稍微复杂&#xff0c;但是主题思路也不难&#xff0c;大家可以一起练习。 孪生质数 在质数中&#xff0c;若两个质数之差为2,我们称之为孪生质数,例如(3、5)(5、7)&#xff0c;输入2个正整数&#xff0c;判断他是不是孪生质数,输出YE…

大数据技术原理-MapReduce的应用

摘要 本实验报告详细阐述了在“大数据技术原理”课程中进行的MapReduce编程实验。实验环境基于Hadoop平台和Ubuntu操作系统。实验的核心内容包括使用MapReduce编程模型实现文件的合并去重、排序以及对给定表格信息的挖掘。实验过程中&#xff0c;我们首先在Hadoop分布式文件系…

基于统计检验与随机森林分析不同天气类型的影响因素

1.项目背景 本项目使用了一个人工合成的天气数据集&#xff0c;模拟了雨天、晴天、多云和雪天四种类型&#xff0c;在分析过程中&#xff0c;对数据进行了异常值处理&#xff0c;并通过描述性统计对数据进行了初步探索&#xff0c;接着&#xff0c;使用Kruskal-Wallis检验、Du…

Flutter连接iPad报错Developer Mode

Flutter连接iPad报错Developer Mode To use 黑色iPad for development, enable Developer Mode in Settings → Privacy & Security.根据错误提示&#xff0c;在ipad中的“安全性”中没有“开发者模型”选项。 打开安全模式步骤: 需要打开Xcode,连接iPad, 在iPad中点击“…

app逆向抓包技巧:ROOT检测绕过

本篇博客旨在记录学习过程&#xff0c;不可用于商用等其它途径 场景 某监管app查壳发现使用了 《梆梆企业版》 加固&#xff0c;想尝试使用frida-dexdump脱壳&#xff0c;打开app发现提示下图样式&#xff0c;由于进不去界面&#xff0c;我们直接脱壳无法保证能获取到完整的 …

虚拟机windows server创建域

目录 准备工作 一、新建域控制器 二、提升为域控制器添加新林 三、新建组织单位&#xff08;OU&#xff09;&#xff0c;用户 四、将计算机加域 五、在域控中管理计算机 六、在域控中配置组策略 七、域内计算机验证组策略配置 准备工作 安装域前&#xff0c;如果有DNS…

Golang | Leetcode Golang题解之第310题最小高度树

题目&#xff1a; 题解&#xff1a; func findMinHeightTrees(n int, edges [][]int) []int {if n 1 {return []int{0}}g : make([][]int, n)deg : make([]int, n)for _, e : range edges {x, y : e[0], e[1]g[x] append(g[x], y)g[y] append(g[y], x)deg[x]deg[y]}q : []i…

二百五十二、OceanBase——Linux上安装OceanBase数据库(二)

一、目的 在OBD页面上部署OceanBase数据库时发现&#xff0c;需要把新用户也要配置ssh免密登录 二、前提 root用户已经设置免密登录 三、配置步骤 1 切换到新用户obadmin [roothurys23 ~]# su obadmin 2 执行命令生成秘钥文件 [obadminhurys23 oceanbase]$ ssh-keygen …

限免下载:715页 | 2024民营企业数字化转型典型案例集

一、前言 数字化转型不仅仅是技术的更新换代&#xff0c;它涉及到企业运营模式、组织架构、企业文化等多个层面的深刻变革。通过数字化&#xff0c;企业能够更好地理解市场动态&#xff0c;提升决策效率&#xff0c;优化客户体验&#xff0c;并最终实现业务增长和价值创造。 …

不可错过的2024翻译工具合集,提升沟通效率必备

如果你想要提升外文阅读能力&#xff0c;但是有没什么外语基础怎么办。现在有不少翻译工具可以实现整份文件进行翻译&#xff0c;让这些工具在日常生活和学习中发挥作用。 1.福昕在线翻译 链接直达&#xff1a;https://fanyi.pdf365.cn/doc 这个工具有齐全的翻译功能。可以…

利用SSE打造极简web聊天室

在B/S场景中&#xff0c;通常我们前端主动访问后端可以使用axios&#xff0c;效果很理想&#xff0c;而后端要访问前端则不能这样操作了&#xff0c;可以考虑SSE、websocket和gRPC等方式&#xff0c;实时和性能均有保障。 下面给出一个简单的例子&#xff0c;后端是nodeexpress…

体验教程:通义灵码陪你备战求职季

本场景将带大家体验在技术面试准备场景下&#xff0c;如何通过使用阿里云通义灵码实现高效的编程算法题练习 、代码优化、技术知识查询等工作&#xff0c;帮助开发者提升实战能力&#xff0c;更加从容地应对面试挑战。主要包括&#xff1a; 1、模拟题练习&#xff1a;精心挑选…