学习IO的第五天

作业 :使用两个线程完成文件的拷贝写入,分线程1写入前半段,分线程2写入后半段,主线程用来回收资源

#include <head.h>void *sork(void *arg);
void *sork2(void *arg);int file_copy(int start,int len)   //拷贝的函数
{int rd = -1;int wd = -1;if((rd = open("./01_test.c",O_RDONLY)) == -1){printf("open_r error\n");}if((wd = open("./text.txt",O_WRONLY)) == -1){printf("open_w error\n");}lseek(rd,start,SEEK_SET);lseek(wd,start,SEEK_SET);char buf[128]="";int count = 0;while(1){int res = read(rd,buf,sizeof(buf));count += res;if(count >= len || res == 0){write(wd,buf,res-(count-len));break;}write(wd,buf,res);}close(rd);close(wd);}int length()
{int rd = -1;int wd = -1;if((rd = open("./01_test.c",O_RDONLY)) == -1){perror("open_r error\n");return -1;}if((wd = open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664) == -1)){perror("open_w error\n");return -1;}int len = lseek(rd,0,SEEK_END);close(rd);close(wd);return len;
}int main(int argc, const char *argv[])
{pthread_t tid = -1;pthread_t tid2 = -1;int len = length();   //获取文件大小if(pthread_create(&tid, NULL, sork, &len) != 0) //创建线程1{printf("创建线程失败\n");return -1;}if(pthread_create(&tid2, NULL, sork2, &len) != 0) //创建线程2{printf("创建线程失败\n");return -1;}pthread_join(tid,NULL);pthread_join(tid2,NULL);printf("已回收分线程资源\n");return 0;
}void *sork(void *arg)  //分支线程1
{int len = *(int *)arg;   file_copy(0,len/2);   //调用拷贝的函数printf("分支线程1退出\n");pthread_exit(NULL);
}void *sork2(void *arg)  //分支线程2
{int len = *(int *)arg;file_copy(len/2,len-len/2);   //调用拷贝的函数printf("分支线程2退出\n");pthread_exit(NULL);
}

结果

不调函数,一样

#include <head.h>void *sork(void *arg);
void *sork2(void *arg);int length()
{int rd = -1;int wd = -1;if((rd = open("./01_test.c",O_RDONLY)) == -1){perror("open_r error\n");return -1;}if((wd = open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664) == -1)){perror("open_w error\n");return -1;}int len = lseek(rd,0,SEEK_END);close(rd);close(wd);return len;
}int main(int argc, const char *argv[])
{pthread_t tid = -1;pthread_t tid2 = -1;int len = length();if(pthread_create(&tid, NULL, sork, &len) != 0) //创建线程1{printf("创建线程失败\n");return -1;}if(pthread_create(&tid2, NULL, sork2, &len) != 0) //创建线程2{printf("创建线程失败\n");return -1;}pthread_join(tid,NULL);pthread_join(tid2,NULL);return 0;
}void *sork(void *arg)  //分支线程1
{int len = *(int *)arg;int rd = -1;int wd = -1;printf("进入分支线程1\n");if((rd = open("./01_test.c",O_RDONLY)) == -1){printf("open_r error\n");}if((wd = open("./text.txt",O_WRONLY)) == -1){printf("open_w error\n");}lseek(rd,0,SEEK_SET);lseek(wd,0,SEEK_SET);char buf[128]="";int count = 0;while(1){int res = read(rd,buf,sizeof(buf));count += res;if(count >= len/2 || res == 0){write(wd,buf,res-(count-len/2));break;}write(wd,buf,res);}close(rd);close(wd);pthread_exit(NULL);
}void *sork2(void *arg)  //分支线程2
{int len = *(int *)arg;int rd = -1;int wd = -1;printf("进入分支线程2\n");if((rd = open("./01_test.c",O_RDONLY)) == -1){printf("open_r error\n");}if((wd = open("./text.txt",O_WRONLY)) == -1){printf("open_w error\n");}lseek(rd,len/2,SEEK_SET);lseek(wd,len/2,SEEK_SET);char buf[128]="";int count = 0;while(1){int res = read(rd,buf,sizeof(buf));if(res == 0){break;}write(wd,buf,res);}close(rd);close(wd);pthread_exit(NULL);}

思维导图

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

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

相关文章

Linux_vi/vim编辑器

3.VI 与 VIM 3.1概述 vi编辑器&#xff1a;是Linux和Unix上最基本的文本编辑器&#xff0c;工作在字符模式下。由于不需要图形界面&#xff0c;vi是效率很高的文本编辑器。 vim是&#xff1a;vi的增强版&#xff0c;比vi更容易使用。vi的命令几乎全部都可以在vim上使用。 3…

Qt图形设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置//设置窗口标题this->setWindowTitle("王者荣耀");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\28033\\Pictures\\Saved Pictures\\pict…

ESP32单片机案例

工具&#xff1a;VScode PlatformIO IDE 注&#xff1a;B站视频学习笔记。 1、继电器 1&#xff09;硬件电路 2&#xff09;程序 #include <Arduino.h> #define RELAY_PIN 15//初始化定时器 hw_timer_t *timer NULL;void timer_interrupt(){ //将引脚传入的电平信号…

二、范围管理

1、范围管理的6个子过程 &#xff1a;规、集、定、创、确、控 规划范围管理&#xff1b; 收集需求&#xff1b; 定义范围&#xff1b; 创建WBS&#xff08;创建工作分解结构&#xff09;&#xff1b; 确认范围&#xff1b; 控制范围。 2、范围管理各过程的输入、输出、工具与…

公众号word文档

在数字化时代&#xff0c;信息的快速获取和高效整理变得尤为重要。微信公众号作为信息传播的重要平台&#xff0c;其内容经常需要被转换成更易于编辑和存档的格式&#xff0c;如Word文档。这里&#xff0c;我们将介绍如何利用“微附件”小程序实现这一过程&#xff0c;并分享一…

第二十一章

网络通信这一章 基本分为三个部分 网络基础概念和TCP,UDP这三个部分主要如下&#xff1a; 计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xf…

利用 Python 进行数据分析实验(三)

一、实验目的 使用Python解决简单问题 二、实验要求 自主编写并运行代码&#xff0c;按照模板要求撰写实验报告 三、实验步骤 本次实验共有4题&#xff1a; 自行给定一个从小到大排好序的数组&#xff0c;输入一个数并将其插入到原始数组中&#xff0c;新的数组还是满足从…

【Effective C++】条款5:了解C++默默编写并调用了哪些函数

某些情况下&#xff0c;编译器会拒绝为你提供默认构造函数 template<class T> class NameObject { public:NameObject(string& name, const T& object):nameValue(name),objectValue(object){} private:string& nameValue;const T objectValue; };int main(…

mixamo根动画导入UE5问题:滑铲

最近想做一个跑酷游戏&#xff0c;从mixamo下载滑铲动作后&#xff0c;出了很多动画的问题。花了两周时间&#xff0c;终于是把所有的问题基本上都解决了。 常见问题&#xff1a; 1.【动画序列】人物不移动。 2.【动画序列】人物移动朝向错误。 3.【蒙太奇】人物移动后会被拉回…

java的多线程技术概览

java的多线程技术 前言今天学习大纲是多线程第一步&#xff1a;学习基础知识第二步&#xff1a;深入学习第三步&#xff1a;实践项目第四步&#xff1a;深度理解高级主题 前言 时代变了&#xff0c;旧的知识需要重新拿起&#xff0c;今天开始记录自己所学同时也是给自己一个复…

谈谈 .NET8 平台中对 LiteDB 的 CRUD 操作

哪个啥&#xff01;纯 C# 编写的 LiteDB 你还不会操作&#xff1f; LiteDB 简介LiteDB 安装1、同步版 LiteDB2、异步版 LiteDB.Async LiteDB StudioLiteDB CRUD 操作举例1、.net cli 命令创建项目2、项目添加相关 nuget 包3、改造项目结构4、改造项目代码 LiteDB vs SQLite 对比…

PostgreSQL 实现 Oracle 多表插入语句

Oracle 数据库提供了一个多表插入功能&#xff0c;也就是 INSERT ALL 语句。这个功能可以方便数据仓库中的 ETL 操作&#xff0c;基于不同逻辑将数据插入一个或者多个不同的表中。 PostgreSQL 被称为开源领域的 Oracle&#xff0c;虽然没有提供 INSERT ALL 语句&#xff0c;但…

用c#实现记事本的功能

知识点&#xff1a; openFileDialog1 是一个 Windows 窗体应用程序中的控件&#xff0c;用于实现文件选择对话框的功能。它是 System.Windows.Forms.OpenFileDialog 类的一个实例。 OpenFileDialog 控件允许用户浏览文件系统并选择要打开的文件。它提供了一些属性和方法&#x…

怎样挖掘客户的需求?有哪些方法?

需求是什么&#xff1f; 需求是人们在某一特定的时期内在愿意付出各种可能的成本&#xff08;时间、精力、现金&#xff09;购买某个具体或者虚拟的商品、服务的数量或数量集合。例如肚子饿了又懒得做&#xff0c;在线点餐外送就是一种需求&#xff0c;用户愿意多花费比线下饭…

JAVA8时间日期类详解

JAVA8 时间日期类 LocalDateTime类(用于代替Date类使用) 用于表示没有时区信息的日期和时间,这个类是不可变的,线程安全的,用于处理日期和时间 LocalDateTime类常用API 常用方法 方法名说明public static LocalDateTime now()获取当前日期与时间public static LocalDateTi…

MySQl int(1)、int(20) 的区别到底在哪里

MySQl int(1)、int(20) 的区别到底在哪里 常思一二&#xff0c;便得自然… int(1)数据类型介绍 在MySQL中&#xff0c;INT(1) 是一种定义整数类型的数据字段&#xff0c;其中的数字表示显示宽度而不是存储范围。具体说&#xff0c;INT(1) 中的数字 1 表示显示宽度&#xff0…

前端小技巧: 写一个异步程序示例, 使用任务队列替代promise和async/await等语法糖

异步程序设定场景 1 &#xff09;场景设定 可以使用懒人每做几件事&#xff0c;就要休息一会儿&#xff0c;并且不会影响做事的顺序这种场景来模拟定义单例名称为: lazyMan支持 sleep 和 eat 两个方法支持链式调用 2 ) 调用示例 const lm new LazyMan(www) lm.eat(苹果).…

LinuxBasicsForHackers笔记 --添加和删​​除软件

使用apt处理软件 apt (Advanced Packaging Tool)。可以使用 apt-get 下载和安装新的软件包&#xff0c;也可以用它更新和升级软件。 许多 Linux 用户更喜欢使用 apt 命令而不是 apt-get。它们在很多方面都很相似&#xff0c;但 apt-get 具有更多功能。 搜索包 在下载软件包之…

高级搜索——ST表,离线RMQ问题

文章目录 前言可重复贡献问题ST表的定义ST表的存储结构ST表的预处理预处理的实现 ST表的区间查询对于k的获取区间查询的实现 OJ链接 前言 对于查询区间最值的方法&#xff0c;我们常用的就是线段树&#xff0c;树状数组&#xff0c;单调队列&#xff0c;而树状数组更适合用于快…

解决Qt发送信号指定重载

现象 信号发送者找不到正确的信号函数 connect(ui->LSpinBox,&QSpinBox::valueChanged,ui->hSlider,&QSlider::setValue);QSpinBox的valueChanged函数分为int和QString两种&#xff0c;存在函数重载&#xff0c;需让编译器加以区分。 不区分的话会爆出&#xff1…