IOday5

news2025/1/10 1:54:49

一、思维导图

二、练习

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

#include<myhead.h>

//定义结构体存储需要传到线程函数中的内容
struct Buf
{
	const char *file[2];		//存储源文件和目标文件文件名
	int start; 			//拷贝开始位置
	int len; 			//存储需要拷贝的长度
};

void *copy(void *buf)
{
	//判断传过来的信息
	//前半部分拷贝
	//解引用结构体参数
	int start = ((struct Buf*)buf)->start;
	int len = ((struct Buf*)buf)->len;
	const char *src =((struct Buf*)buf)->file[0];
	const char *dest = ((struct Buf*)buf)->file[1];

	//打开源文件和目标文件描述符
	int sfd = open(src,O_RDONLY);
	if(-1 == sfd)
	{
		perror("open src error");
	}

	int dfd = open(dest,O_WRONLY);
	if(-1 == dfd)
	{
		perror("open dest error");
	}

	//根据参数判断拷贝部分
	if(start == 0)
	{
		//线程1执行的内容
		//拷贝前一半
		printf("1start = %d,len = %d\n",start,len);
		//移动文件光标
		lseek(sfd,start,SEEK_SET);
		lseek(dfd,start,SEEK_SET);
	
	}
	//后半部分拷贝
	else if(start != 0)
	{
		//线程2执行的内容
		//拷贝后一半
		printf("2start = %d,len = %d\n",start,len);
		//移动文件光标
		lseek(sfd,start,SEEK_SET);
		lseek(dfd,start,SEEK_SET);

	}

	//定义拷贝容器
	char Cop[128];
	int sum = 0; 	//累加拷贝的字节数量
	while(1)
	{
		int res = read(sfd,Cop,sizeof(Cop));
		sum += res; 		//将读取的个数累加

		if(res==0 || sum>len)
		{
			write(dfd,Cop,res-(sum-len)); 	//前半部分最后一次拷贝写入到目标文件中
			break;
		}
		//写入到目标文件中
		write(dfd,Cop,res);
	}

	printf("拷贝成功\n");

	//退出线程
	pthread_exit(NULL);


}

int main(int argc, const char *argv[])
{
	//判断终端数入
	if(argc != 3)
	{
		printf("input error\n");
		printf("usage:./a.out srcfile destfile\n");
		return -1;
	}

	//打开源文件和目标文件描述符
	int sfd = open(argv[1],O_RDONLY);
	if(-1 == sfd)
	{
		perror("open src error");
		return -1;
	}

	int dfd = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(-1 == dfd)
	{
		perror("open dest error");
		return -1;
	}

	//计算出源文件长度以及线程2拷贝开始位置
	int len = lseek(sfd,0,SEEK_END);
	printf("len= %d\n",len);

	//关闭文件
	close(sfd);
	close(dfd);

	//定义两个容器分别传输两个线程的参数
	struct Buf buf1 ={{argv[1],argv[2]},0,len/2};
	struct Buf buf2 ={{argv[1],argv[2]},len/2,len-len/2};

	//定义线程变量
	pthread_t tid1,tid2;

	//创建两个线程
	if(pthread_create(&tid1,NULL,copy,&buf1) != 0)
	{
		printf("tid1创建失败\n");
		return -1;
	}

	if(pthread_create(&tid2,NULL,copy,&buf2) != 0)
	{
		printf("tid2创建失败\n");
		return -1;
	}

	//阻塞等待线程的结束
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	return 0;
}

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

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

相关文章

Python爬虫:下载人生格言

Python爬虫:下载人生格言 爬取网页 将这些格言下载存储到本地 代码: import requests #导入requests库&#xff0c;用于提取网页 from lxml import etree#导入lxml库&#xff0c;用于Xpath数据解析#请求头 header{ user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) A…

aurora8b10b ip的使用(未完)

文章目录 一、Aurora8B/10B协议二、时钟、复位与状态指示1、时钟2、复位3、状态指示 三、数据发送、接受接口&#xff08;1&#xff09;AXI4-Stream位排序&#xff08;2&#xff09;Streaming接口&#xff08;3&#xff09;Framing接口&#xff08;帧传输接口&#xff09; 四、…

输入成绩问题(c语言)

1.问题&#xff1a;期中考试开始了&#xff0c;大家想要取得好成绩&#xff0c;争夺前五名&#xff0c;从键盘输入n个学生成绩&#xff08;不超过40个&#xff09;&#xff0c;输出每组的前五名的成绩 两行&#xff0c;第一行输入一个整数&#xff0c;表示n个学生&#xff08;…

springboot学习笔记第一天

springboot的简单了解 Java Spring 是一个开源的轻量级应用框架&#xff0c;在 Java 应用开发中起到了简化开发、提高效率、促进模块化和松耦合、支持技术集成等多重作用&#xff0c;成为了广大企业和开发者首选的企业级 Java 应用开发框架之一。 Spring Boot 是一个基于 Spr…

深度学习中6种loss函数Pytorch API调用示例

自定义数据 import torch import torch.nn as nn import torch.nn.functional as Fbatchsize2 num_class4logitstorch.randn(batchsize,num_class) targettorch.randint(num_class,size(batchsize,))#delta目标分布 target_logitstorch.randn(batchsize,num_class)#非delta目标…

浏览器中的同源策略、CORS 以及相关的 Fetch API 使用

前言 笔者对前端 Web 技术的认真学习&#xff0c;其实开始于与 Fetch API 的邂逅。当时觉得 fetch() 的设计很不错&#xff0c;也很希望能够请求其它网站下的数据并作处理和展示。学习过程中 HTML 和 CSS 都还好说&#xff0c;由于几乎没有 Web 技术的基础&#xff0c;学习 Fe…

vue配置多个环境变量ENV【收藏版】

vue配置多个环境变量 1. 创建环境变量文件 在你的Vue项目根目录下&#xff0c;你可以创建以下环境变量文件&#xff1a; .env&#xff1a;所有环境都会加载的通用变量。 .env.local&#xff1a;本地覆盖&#xff0c;不会被git跟踪。 .env.[mode]&#xff1a;只有指定模式才会…

1007 Maximum Subsequence Sum(Java)

题目 解释 题目说的就是给你一串K个数字&#xff0c;让你找到连续的和最大的子串&#xff0c;同时输出子串的和、子串起始的元素、子串末尾的元素&#xff0c;如果K个数字全是负数&#xff0c;输出子串和为0、子串起始元素为整个字符串的第一个元素&#xff0c;子串末尾元素为…

CompletableFuture并行编程生产问题处理

前提 本文章是在项目中发现一些同学对并行编程的思想理解&#xff0c;或者说对代码的执行逻辑有些理解偏颇的地方。特整理此文章进行分享&#xff0c;希望有同样困惑的小伙伴能够对此类问题有一个清晰的理解。 在此不会介绍CompletableFuture对库函数用法&#xff0c;因为库函数…

XSS-labs靶场(超详解)1-20关——附原码

level1 原码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff0…

【Java】字符串StringBuilder类和Stringjoiner类(013)

目录 ♦️StringBuilder类 &#x1f38f;StringBuilder构造方法 &#x1f421;无参构造 &#x1f421;有参构造 &#x1f38f;SringBuilder常用方法 &#x1f38f;StringBuildre类练习题&#xff1a; &#x1f421;对称字符串 &#x1f421;拼装字符串 ♦️Stringjoine…

(Python)内存管理

前言 内存泄漏在编程中是一个严重的问题&#xff0c;可能导致程序性能下降、系统不稳定甚至崩溃。 目录 危害 风险 动态内存分配 引用计数 内存池 垃圾回收 设计原则 危害 性能下降&#xff1a;可用内存减少&#xff0c;导致系统频繁进行内存交换&#xff0c;使程序运行…

Netdevops入门之Telnetlib语法案例

1、Telnetlib模块&#xff1a; 支持telnet/ssh远程访问的模块很多&#xff0c;常见的有telnetlib、ciscolib、paramiko、netmiko、pexpect,其中telnetlib和ciscolib对应telnet协议&#xff0c;后面3个对应SSH协议。 ①-通过ENSP环境搭建实验环境 ②-基础语法-telnetlib案例1&…

最优控制、轨迹优化相关笔记、感悟

写在前面 上学期和最近无聊在看一些最优控制、轨迹优化相关的内容&#xff0c;涉及到MIT Russ Tedrake教授的Underactuated Robotics&#xff0c;以及CMU Zachary Manchester教授的Optimal Control&#xff08;两套课程其实挺像的&#xff09;&#xff0c;加起来估计也看了十多…

机器学习算法(二)线性模型

一、线性回归 假设自变量X矩阵有3个特征&#xff0c;因变量是Y矩阵&#xff0c;w是系数矩阵 Y X * w 损失函数&#xff1a;误差平方和函数&#xff08;Y - label&#xff09;** 2 二、逻辑回归 线性回归得到的是一个实数值 z &#xff0c;用sigmoid函数可以将其映射到 0 …

【SQL Server 】SQL Server 网络配置

目录 ​编辑 第3章&#xff1a;SQL Server 网络配置 SQL Server 网络监听器 SQL Server 网络协议 配置 SQL Server 网络协议 示例&#xff1a;配置 SQL Server 使用自定义端口 安全注意事项 第3章&#xff1a;SQL Server 网络配置 SQL Server 网络监听器 SQL Server 通…

php时间 cookie session 文件上传基础

时间和日期 PHP Date&#xff08;&#xff09; 函数 格式// date(format,timestamp) format Required. Specifies the format of the timestamp timestamp Optional. Specifies a timestamp. Default is the current date and time d - 表示每月的某一天&#xff08;01…

反序列化漏洞靶机实战-serial

一.安装靶机 下载地址为https://download.vulnhub.com/serial/serial.zip&#xff0c;安装好后开启靶机&#xff0c;这里并不需要我们去登录&#xff0c;直接扫描虚拟机nat模式下c网段的ip&#xff0c;看看哪个的80端口开放&#xff0c;然后直接去访问 二.查找cookie 访问靶…

Java Try学习

一. 介绍 io.vavr.control.Try 是 Vavr 库的一个类&#xff0c;用于处理可能抛出异常的方法调用&#xff1b;它提供了一种优雅的方式来处理成功和失败的情况&#xff0c;而无需显示地使用 try-catch 块&#xff1b; 简而言之&#xff0c;它可以优雅的实现 try-catch&#xff…

链表【4】

目录 链表删除指定值元素 反转链表&#xff08;静态链表型&#xff09; 链表删除指定值元素 错误1&#xff1a;两个if间没有用else&#xff0c;导致两个都执行了 #include<stdio.h> const int N1005; int n,first,firstid; using namespace std; struct node {int da…