2024.8.1 作业

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

代码:

/*******************************************/

文件名:threadwork.c

/*******************************************/

#include <myhead.h>
//创建传输信息的结构体
struct TXT
{char *a;char *b;int key;
};
//定义求源文件大小的函数
int get_file_len(const char *srcfile, const char *destfile)
{//以只读的形式打开源文件int sfd = open(srcfile, O_RDONLY);if (sfd == -1){perror("open srcfile error");return -1;}//以创建的形式打开目标文件int dfd = open(destfile, O_WRONLY | O_CREAT | O_TRUNC, 0664);if (dfd == -1){perror("open destfile error");return -1;}int size = lseek(sfd, 0, SEEK_END);//关闭文件close(sfd);close(dfd);return size; //将文件大小返回
}//定义文件拷贝函数
void copy_file(const char *srcfile, const char *destfile, int start, int len)
{//以只读的形式打开源文件int sfd = open(srcfile, O_RDONLY);if (sfd == -1){perror("open srcfile error");return;}//以创建的形式打开目标文件int dfd = open(destfile, O_WRONLY);if (dfd == -1){perror("open destfile error");return;}//移动光标位置lseek(sfd, start, SEEK_SET);lseek(dfd, start, SEEK_SET);//定义搬运工char buf[128] = "";int sum = 0; //记录拷贝的总个数while (1){//从源文件中读取数据int res = read(sfd, buf, sizeof(buf));sum += res; //将读取的个数累加if (res == 0 || sum > len) //表示文件读取结束{write(dfd, buf, res - (sum - len)); //父进程将最后一次拷贝结束break;}//写入到目标文件中write(dfd, buf, res);}//关闭文件close(sfd);close(dfd);
}
void *task(void *arg)
{if (arg == NULL){return NULL;}// 将arg转换为struct TXT指针struct TXT *txt_ptr = (struct TXT *)arg;int len = get_file_len(txt_ptr->a, txt_ptr->b);pid_t pid = fork();if (txt_ptr->key == 0){//线程1拷贝前一半copy_file(txt_ptr->a, txt_ptr->b, 0, len / 2);pthread_exit(NULL);}else if (txt_ptr->key == 1){//线程2拷贝后一半copy_file(txt_ptr->a, txt_ptr->b, len / 2, len - len / 2);pthread_exit(NULL);}else{printf("load error\n");}
}
int main(int argc, char const *argv[])
{//判断是否是三个文件if (argc != 3){write(2, "input file error\n", sizeof("input file error\n"));return -1;}// 使用strdup复制argv中的字符串,因为argv中的字符串是常量char *source = strdup(argv[1]);char *destination = strdup(argv[2]);if (!source || !destination){perror("strdup failed");// 释放之前可能已经分配的内存free(source);free(destination);return -1;}//创建结构体接收字符信息struct TXT txt1 = {source, destination, 0};struct TXT txt2 = {source, destination, 1};//创建两个线程pthread_t tid1, tid2;if (pthread_create(&tid1, NULL, task, &txt1) != 0){printf("thread create error\n");return -1;}if (pthread_create(&tid2, NULL, task, &txt2) != 0){printf("thread create error\n");return -1;}//阻塞等待线程结束pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;
}

结果:

思维导图:

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

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

相关文章

06.java集合

1.集合框架体系 集合主要分为两组&#xff1a;单列集合(collection)&#xff0c;双列集合(map) 单列集合(collection接口) 双列集合(map接口) 2.Collection接口 (1).常见的方法 */ public class arraylist_ {public static void main(String[] args) {//常用方法&#xff0…

Day81 代码随想录打卡|贪心算法篇---跳跃游戏 II

题目&#xff08;leecode T45&#xff09;&#xff1a;给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j…

【Linux】(26) 详解磁盘与文件系统:从物理结构到inode机制

目录 1.认识磁盘、 1.1 理论 1.2 磁盘的物理结构 CHS 寻址 1.3 磁盘的逻辑抽象结构 2. inode 结构 1.Boot Block 启动块 2.Super Block&#xff08;超级块&#xff09; 3.Group Descriptor Block&#xff08;块组描述符&#xff09; 4.Data Blocks (数据块) 5.Inode…

【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间 本章将分享缺省参数与函数重载相关知识&#xff0c;为了更加深入学习C打下了坚实的基础。本章重点在于缺省参数与函数重载使用前提与注意事项 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1…

[C++]多态与虚函数

一、多态的概念 顾名思义&#xff0c;多态的意思就是一个事物有多种形态&#xff0c;在完成某个行为的时候&#xff0c;当不同的对象去完成时会产生不同的状态。在面向对象方法中一般是这样表示多态的&#xff1a;向不同的对象发送同一条消息&#xff0c;不同的对象在接收时会产…

jetbrain插件市场无法下载插件/idea插件install无效

最近把电脑重装了一次系统&#xff0c;发现idea插件市场可以搜到插件&#xff0c;但是不显示overview之类的信息&#xff0c;点install也没反应。 于是打算直接到插件市场的官网plugins.jetbrains.com下载插件安装。 结果发现同样可以搜索到插件&#xff0c;但是无法下载。 在…

中国工商银行长春分行开展“工驿幸福 健康财富”长辈客群康养活动

中国工商银行长春分行作为国有大行&#xff0c;持续完善有温度、专业化、安全稳健的养老场景服务&#xff0c;以工行驿站为依托、以长辈客群养老需求为中心&#xff0c;积极对接社区构建敬老、康养的“金融泛金融”工行驿站服务生态&#xff0c;进一步提升长辈客群的到店体验。…

第十九天培训笔记

上午 1 、构建 vue 发行版本 [rootserver eleme_web]# nohup npm run serve& // 运行 vue 项目 [rootserver eleme_web]# mkdir /eleme [rootserver eleme_web]# cp -r /root/eleme_web/dist/* /eleme/ // 将项目整体 移动到 /eleme 目录下 [rootserver eleme_web]# …

Opencv threshold函数、adaptiveThreshold函数详解和示例

1.threshold函数 double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type ) src&#xff1a;待二值化的图像&#xff0c;图像只能是 CV_8U 和 CV_32F 两种数据类型。对于图像通道数目的要求与选择的二值化方法相关。dst&#xff1a;…

TypeScript 定义不同的类型(详细示例)

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

Vulnhub - JANGOW: 1.0.1 靶标实战

靶场地址&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 靶场IP&#xff1a;192.168.56.118 信息收集 使用御剑对目标进行扫描 该靶标开启了21、80两个端口&#xff0c;21端口运行服务为ftp&#xff0c;其版本为 vsftpd 3.0.3 &#xff0c;80端口运行服务为Apa…

vscode+platformio开发小技巧

使用vscodeplatformio开发&#xff0c;具体安装配置文章很多&#xff0c;这里分享一些方便使用的小技巧&#xff0c;让使用体验在不增加学习成本的情况下更加丝滑。 1、配置依赖库 在使用vscode开发前&#xff0c;arduino环境遗留了一些库文件&#xff0c;这些第三方库可以通…

arasan CAN2.0 CAN FD user guide详解

1. 引言 1.1 概览 Arasan 的 Controller Area Network - Flexible Data (CAN-FD) 控制器 IP 实现了 CAN 2.0A、CAN 2.0B 以及高性能 CAN-FD (Flexible Data Rate) 协议。它符合非 ISO CAN-FD 由 Bosch 提出的标准以及 ISO11898-1:2015 DIS 标准。它可以集成到需要 CAN 连接性…

2024年有哪些开放式耳机值得入手?精选五大高分品牌

近几年兴起的开放式蓝牙耳机&#xff0c;具有佩戴舒适稳固、不影响使用者判断外界环境等优点&#xff0c;十分适合在户外环境下使用&#xff0c;因此受到了众多健身人士的喜爱。那么该如何挑选到一款适合自己的开放式耳机呢&#xff1f;2024年有哪些开放式耳机值得入手&#xf…

SpringCloud Alibaba 微服务(四):Sentinel

目录 前言 一、什么是Sentinel&#xff1f; Sentinel 的主要特性 Sentinel 的开源生态 二、Sentinel的核心功能 三、Sentinel 的主要优势与特性 1、丰富的流控规则 2、完善的熔断降级机制 3、实时监控和控制台 4、多数据源支持 5、扩展性强 四、Sentinel 与 Hystrix …

Axure Web端元件库:构建高效互动网页的基石

在快速迭代的互联网时代&#xff0c;Web设计与开发不仅追求视觉上的美感&#xff0c;更注重用户体验的流畅与功能的强大。Axure RP&#xff0c;作为一款专业的原型设计工具&#xff0c;凭借其强大的交互设计能力和丰富的元件库&#xff0c;成为了众多UI/UX设计师、产品经理及前…

C语言 ——— 指针笔试题(中篇)

指针加减整数和解引用的笔试题 笔试题1&#xff1a; int a[5][5]; int(*p)[4]; p a;printf("%p %d", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);问&#xff1a;打印的结果为&#xff1f;&#xff08;分别以 %d 和 %p 的形式打印&#xff09; …

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十二章 定时器按键消抖实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

linux系统ShellCheck检查shell脚步语法正确的工具

目录 ShellCheck 安装ShellCheck 、dnf、yum 源代码编译 步骤如下&#xff1a; 示例命令&#xff1a; 方法三&#xff1a;使用其他第三方仓库、COPR 仓库 假设 ShellCheck 输出如下&#xff1a; 分析输出 修改脚本 再次运行 ShellCheck 1. Shell 脚本最佳实践 主题…

环境如何搭建部署Nacos

这里我使用的是Centos7&#xff0c; Nacos 依赖 Java环境来运行。如果您是从代码开始构建并运行Nacos&#xff0c;还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用 ## 1、下载安装JDK wget https://download.oracle.com/java/17/latest/jdk-17_linux-x6…