linux下实现多线程拷贝命令
来源:互联网 发布:re take 知乎 编辑:程序博客网 时间:2024/05/29 02:24
实现多线程拷贝命令,如:./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 <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <pthread.h>#include <sys/mman.h>#include <string.h>#include <unistd.h>#define N 5int 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;elsenthread = 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;}
0 0
- linux下实现多线程拷贝命令
- 多线程实现文件拷贝(Linux下C++)
- linux下常用拷贝命令
- linux下常用拷贝命令
- Linux下拷贝整个文件夹的命令
- Android( linux )下常用拷贝命令
- linux下用dd命令拷贝硬盘
- Linux下的scp拷贝命令详解
- Linux下的scp拷贝命令详解
- linux下的远程拷贝命令scp
- Linux下C语言实现文件拷贝
- linux系统下实现文件拷贝
- 多线程实现文件拷贝
- 多线程实现文件拷贝
- linux 多线程拷贝文件
- linux下多线程的实现
- linux下C实现多线程
- linux下scp命令详解--主机之间拷贝文件
- DNS扫盲系列之一:有关公网DNS
- vsftpd在ubuntu server 12.04 下的设置。
- JavaWeb——Day18_2
- [字典树] HDU 1075 - What Are You Talking About
- 周剑轩:个人生态系统理论
- linux下实现多线程拷贝命令
- 1、Hibernate入门
- 关于Linux静态库和动态库的分析
- SQL Server 2008数据类型
- Android UI, Gallery(过时), ImageSwitcher, 简单图片浏览工具
- DNS扫盲系列之二:域名解析及DNS功能分类
- 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
- CodeForces 34A Reconnaissance 2
- Android 系统信息获取(CPU,RAM,ROM,Battery,SD-card,版本等)