实现多线程拷贝命令,如:./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;

}

linux 线程 拷贝,linux下实现多线程拷贝命令相关推荐

  1. linux线程篇,linux线程篇 (二) 线程的基本操作

    线程 进程 标识符 pthread_t pid_t 获取ID pthread_self() getpid() 创建 pthread_create() fork 销毁 pthread_exit() ex ...

  2. linux 线程流水线,linux线程同步

    我是linux和linux线程的新手.我花了一些时间谷歌搜索试图理解可用于线程同步的所有函数之间的差异.我还有一些问题. 我找到了所有这些不同类型的同步,每个同步都有许多锁定,解锁,测试锁等功能. g ...

  3. 查看linux线程个数,linux查看cpu个数,线程数及cpu型号

    1.查看CPU逻辑id grep 'physical id' /proc/cpuinfo | sort -u physical id : 0 physical id: 1 2.查看物理CPU个数 $ ...

  4. linux线程 ppt,Linux多线程编程多核编程.ppt

    <Linux多线程编程多核编程.ppt>由会员分享,可在线阅读,更多相关<Linux多线程编程多核编程.ppt(28页珍藏版)>请在装配图网上搜索. 1.Linux多线程编程, ...

  5. sleep 函数 linux 线程吗,sleep函数在多线程中的作用

    1.前言 多线程中经常会使用sleep()函数,我们知道cpu对于多线程的操作是采用时间片轮询的方式,即,时间片1操作线程A,时间片1结束后,时间片2操作线程B,时间片2结束后,时间片3操作线程A,依 ...

  6. linux线程wait和sleep,java多线程 sleep()和wait()的区别

    接触了一些多线程的东西,还是从java入手吧. 相信看这篇文章的朋友都已经知道进程和线程的区别,也都知道了为什么要使用多线程了. 这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通 ...

  7. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  8. linux 线程 ulimit,linux ulimit命令用法解析

    学习ulimit命令的用法. 功能说明:控制shell程序的资源. 语 法:ulimit [-aHS][-c 补充说明:ulimit为shell内建指令,可用来控制shell执行程序的资源. 参 数: ...

  9. linux线程负载,linux 排查cpu负载过高异常(转载)

    问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 步骤一.找到最耗CPU的进程 工具:top 方法: 执行top -c ,显示进程运行信息列表 键入P (大写 ...

最新文章

  1. MVC 之 属性详解
  2. 【Linux系统编程学习】Linux线程控制原语
  3. python爬虫能秒杀么_面试题之用python爬取并夕夕不同时段秒杀商品信息
  4. Git error. Command: `git ls-files --cached --exclude-standard --recurse-submodules`
  5. Java讲课笔记27:RandomAccessFile与对象序列化
  6. 从还珠格格到街头霸王!80后的怀旧神器 三星GalaxyFold另类体验
  7. 随记(电脑硬件对比)
  8. python计算iv值_大数据技术 python计算IV值及使用
  9. Manchester Reunited 网站设计报告 // 当初的课程论文,纯怀念了=v=
  10. Kali系统2022VM版本的安装
  11. 适合初学者使用的Mac绘图软件推荐
  12. GEE拼接字符串出错,原因是忘了加getInfo()
  13. 用什么软件测试内存条稳定,如何检测内存条的好坏有什么软件
  14. LigerUi的Form表单展示
  15. vi 放弃更改退出 保存更改退出。
  16. 哪些关于硬件的事之串行与并行到底是hang还是xing
  17. 使用 js 实现累乘之和
  18. 千万级用户产品更名为“亿图脑图 MindMaster”背后:脑图软件市场高速增长
  19. 什么是云计算的简单理解
  20. vue3函数写法中的状态、函数定义

热门文章

  1. python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程
  2. 解决Maven工程install时[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources
  3. Java程序和MySQL数据库中关于小数的保存问题
  4. Linux 命令之 set -- 显示或设置 shell 特性及 shell 变量
  5. Linux主机通过直连线直连,【IT基础】网线的直连线与交叉线之间的区别
  6. word域变成正常文本_【Word小技巧】不学会后悔哦~
  7. 深度学习基础实战使用MNIST数据集对图片分类
  8. 【安卓开发 】Android初级开发(八)WebView网页
  9. QT 手动创建信号函数 与 槽函数
  10. C语言中的“悬空指针”和“野指针”是什么意思?