linux 线程 拷贝,linux下实现多线程拷贝命令

实现多线程拷贝命令,如:./multithread_copy  srcfile destfile N(拷贝线程个数)

难点:

内存映射mmap。

给每一个线程合理的分配任务。

多线程的实现。

具体的实现代码如下:

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

> File Name: multithread_copy.c

> Author: lucifer

> Mail: lucifer@163.com

> Created Time: 2014年11月14日 星期五 17时43分36秒

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define N 5

int nthread = 0;

struct allocate_task

{

char *start;

char *end;

int size;

int num;

};

void sys_err(const char *str)

{

perror(str);

exit(-1);

}

void *thread_copy(void *arg)

{

int i;

struct allocate_task *s = (struct allocate_task *)arg;

for(i = 0;i < nthread;i++)

{

memcpy(s[i].end,s[i].start,s[i].size);

}

}

int main(int argc, char *argv[])

{

int fdsrc, fddest, i, err, total_size,task_size;

struct stat sbuf;

char *psrc,*pdest;

if(argc < 3)

{

fprintf(stdout,"%s srcname destname\n",argv[0]);

exit(-1);

}

if(argc = 3)

nthread = N;

else

nthread = atoi(argv[3]);

if(stat(argv[1],&sbuf) < 0)

sys_err("stat");

total_size = sbuf.st_size;

fddest = open(argv[2],O_CREAT |O_RDWR | O_TRUNC,0664);

if(fddest < 0)

sys_err("open");

if(lseek(fddest,total_size - 1,SEEK_SET) < 0)

sys_err("lseek");

write(fddest,"\0",1);

fdsrc = open(argv[1],O_RDONLY);

if(fdsrc < 0)

sys_err("open");

psrc = mmap(NULL,total_size,PROT_READ,MAP_PRIVATE,fdsrc,0);

if(psrc == MAP_FAILED)

sys_err("mmap");

pdest = mmap(NULL,total_size,PROT_WRITE,MAP_SHARED,fddest,0);

if(pdest == MAP_FAILED)

sys_err("mmap");

close(fdsrc);

close(fddest);

struct allocate_task *work = malloc(nthread * sizeof(struct allocate_task));

task_size = total_size / nthread;

for(i = 0;i < nthread - 1;i++)

{

work[i].start = psrc + i * task_size;

work[i].end = pdest + i * task_size;

work[i].size = task_size;

}

work[i].start = psrc + i * task_size;

work[i].end = pdest + i * task_size;

work[i].size = total_size - task_size * (nthread - 1);

work[i].num = i;

pthread_t tid[nthread];

for(i = 0;i < nthread;i++)

{

err = pthread_create(&tid[i],NULL,thread_copy,(void *)work);

if(err != 0)

{

printf("%s\n",strerror(err));

break;

}

}

for(i = 0;i < nthread; i++)

{

pthread_join(tid[i],NULL);

}

free(work);

return 0;

}

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

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

相关文章

vivado安装_Vivado下载与安装指南

Vivado下载与安装指南目前&#xff0c;vivado已推出2019.1版本&#xff0c;实验室所安装的为2018.3版本&#xff0c;由于软件向下兼容的特性&#xff0c;建议安装2018版本&#xff0c;若安装2019版本&#xff0c;请自带笔记本&#xff0c;安装过程与之前没有差别&#xff0c;这…

linux中kafka主题修改分区,kafka_2.11-2.0.0的部署与配置修改

1 [yunmini01 config]$ pwd2 /app/kafka/config3 [yunmini01 config]$ vim server.properties4 ############################# Server Basics #############################5 # 每一个broker在集群中的唯一标示★★★6 # 比如mini01 为0 mini02 为1 mini03 为27 broker.id089…

python中字符串乘法_python leetcode 字符串相乘实例详解

给定两个以字符串形式表示的非负整数 num1 和 num2 &#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…

嵌入式基于linux电机控制器,基于嵌入式Linux的移动机器人控制系统

使用select机制监控是否语音识别结果&#xff0c;在超出等待时间后&#xff0c;会退出等待并重新初始化语音模块LD3320&#xff0c;释放公共资源&#xff0c;这样也使得系统能够及时响应LD3320的MP3播放功能&#xff0c;避免了在长时间没有语音识别结果时&#xff0c;系统进入卡…

jdk8运行jdk7的代码_即使在jdk中也有错误的代码

jdk8运行jdk7的代码Java 7&#xff0c;TreeSet和NullPointerException。 最近&#xff0c;我尝试用Java 7编译一个用Java 6开发的项目。在执行测试过程中发生了很多有趣的事情&#xff0c;在Java 6中使用Java 7平稳运行的测试失败了&#xff01; 因此&#xff0c;我必须理解为什…

zen of python什么意思_如何理解「The Zen of Python」?

import thisThe Zen of Python, by Tim PetersPython之禅 &#xff0c;by Tim PetersBeautiful is better than ugly.优美好于丑陋(Python 以优美的代码为其风格&#xff0c;不要写丑陋的代码)Explicit is better than implicit.明了好于隐晦(Python的每一行代码、每一个变量、…

linux用pipe创建的文件类型,linux文件类型之 管道

inux管道管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间&#xff0c;这是它与有名管道的最大区别。有名管道叫namedpipe或者FIFO(先进先出)&#xff0c;可以用函数mkfifo(…

Spring Webflux – Kotlin DSL –实现的演练

在先前的博客文章中&#xff0c;我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里&#xff0c;我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样&#xff1a; package sample.ro…

python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

本篇主页内容&#xff1a;match的基本使用&#xff0c;search的基本使用&#xff0c;findall,finditer的基本使用&#xff0c;匹配中文&#xff0c;贪婪与非贪婪模式Python爬虫教程-19-数据提取-正则表达式(re)正则表达式&#xff1a;一套规则&#xff0c;可以在字符串文本中进…

c语言作业请输入一个运算符,C语言书面作业1(有答案版)..doc

C语言书面作业1(有答案版).书面作业1(数据类型、变量、输入/输出、运算符与表达式、选择结构、循环结构)一、判断题&#xff1a;在正确的说法前面填写T&#xff0c;在错误的说法前面填写F(每题1分)[得分&#xff1a; ]()()()()标识符中可以出现下划线但它不可以放在标识符的开头…

windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...

每当我问到客户&#xff0c;“你用什么存储产品作为文件共享&#xff1f;”经常听到的一个答案(自豪滴)是&#xff0c;“文件共享需要存储么&#xff1f;我们用Windows就可以做到。”Windows就是个百宝箱&#xff0c;什么都能往里装&#xff0c;就像你家冰箱一样。众所周知&…

c语言编写日历作业,c语言实现一个简单日历

满足三个需求:1&#xff0e;输入一个年份&#xff0c;输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2&#xff0e;输入年月&#xff0c;输出该月的日历。3&#xff0e;输入年月日&#xff0c;输出距今天还有多少天&#xff0c;星期几&#xff0c;是否是公历…

将EntityManager.refresh添加到所有Spring数据存储库

在我以前的文章《从Spring Data JPA访问EntityManager》中&#xff0c;我展示了如何扩展单个Spring Data JPA存储库以访问EntityManager.refresh方法。 这篇文章演示了如何将EntityManager.refresh添加到所有Spring Data Repository。 源代码 第一步是定义您的界面- package …

pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展

土壤营养元素流失、重金属污染是当前全球面临的突出环境问题。生物炭因其具有比表面积较大、吸附性能高和成本低等优点而在环境修复领域日益受到广泛关注&#xff0c;被作为水处理吸附剂、土壤修复改良剂广泛应用于农业土壤改良和环境中重金属的修复和钝化。但通常情况下&#…

Java命令行界面(第26部分):CmdOption

由于Tweet&#xff0c;我了解了本系列中第26个基于Java的功能强大的库&#xff0c;该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的&#xff0c;用于Java 5应用程序的简单注释驱动的命令行解析器工具包。” 该项目的副标题是“命令行解析从未…

vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止

C.62: Make copy assignment safe for self-assignmentC.62:保证拷贝赋值对自我赋值安全Reason(原因)If x x changes the value of x, people will be surprised and bad errors will occur (often including leaks).如果xx改变了x的值&#xff0c;人们会觉得很奇怪&#xff0…

c语言字符流缓冲区,深入理解C语言的IO及缓冲操作

http://www.shangxueba.com/jingyan/1837313.html2014与文件I/O围绕文件描述符操作不同&#xff0c;标准I/O的操作是围绕流进行的。流&#xff1a;对于流&#xff0c;《C和指针》里有一段解释得很好&#xff1a;ANSI C进一步对I/O的概念进行了抽象。就C程序而言&#xff0c;所有…

maven插件依赖_当Maven依赖插件位于

maven插件依赖问题&#xff1a; 我们进行了一个集成测试&#xff0c;该测试创建了一个Spring ClassPathXmlApplicationContext &#xff0c;同时这样做导致NoSuchMethodError爆炸。 事实证明&#xff0c;我们对Spring构件的依赖版本存在冲突。 这本身不是一个不寻常的问题-使用…

华为编程规范_华为 Java 编程规范出炉,究竟和官方文档有何不同?

来源&#xff1a;blog.csdn.net/chenleixing/article/details/441739851、引言这个标准是衡量代码本身的缺陷&#xff0c;也是衡量一个研发人员本身的价值。华为作为一家全球化的 IT 公司&#xff0c;十几万员工&#xff0c;无论是人事管理&#xff0c;还是代码管理&#xff0c…

变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在

函数内创建的数组在调用后&#xff0c;是不是就不存在本帖最后由 test_lockxxx 于 2014-04-23 09:31:06 编辑第1种写法&#xff1a;char *getABC(){char str[10];strcpy(str,"12345");return str;}void main(){char *p getABC();printf("%s\n",p); //这…