博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux--多进程进行文件拷贝
阅读量:4954 次
发布时间:2019-06-12

本文共 2281 字,大约阅读时间需要 7 分钟。

学习IO的时候,我们都曾经利用文件IO函数,标准IO函数都实现了对文件的拷贝,

对某一个文件进行拷贝时,我们可以考虑一下几种方式:

a.单进程拷贝:

假设某一文件需要拷贝100字节,每一个时间片可以完成拷贝20个字节工作量,则需要被分配5个时间片才可以完成任务,但问题是这些个时间片并不是被连续分配的,我们并不知道

到经过多少时间片才会有下一个能分配给该进程的时间片,为了解决这个问题,我们有了第二种方法。

b.多进程拷贝(单核单CPU):

 通过切换进程,随着进程数的增加,当前程序获得时间片所需要的时间也就更少。

c.多进程拷贝(多核并发处理)

我们要实现的是第二个方法,代码如下:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 int cutting(char *src,int prono) 10 { 11 int fd,filesize; 12 if((fd=open(src,O_RDONLY))==-1) 13 { 14 perror("cutting open failed"); 15 return -1; 16 } 17 if((filesize=lseek(fd,0,SEEK_END))==-1) 18 { 19 perror("filesize failed"); 20 close(fd); 21 return -1; 22 } 23 int blocksize; 24 if(filesize%prono==0) 25 { 26 blocksize=filesize/prono; 27 } 28 else 29 { 30 blocksize=filesize/prono+1; 31 } 32 close(fd); 33 //printf("%d",blocksize); 34 return blocksize; 35 36 } 37 int copy(char *src,char *des,int pos,int blocksize) 38 { 39 if(access(src,F_OK)==-1) 40 { 41 perror("acess failed"); 42 } 43 int fd1,fd2; 44 char buf[blocksize]; 45 fd1=open(src,O_RDONLY); 46 fd2=open(des,O_WRONLY|O_CREAT,0664); 47 lseek(fd1,pos,SEEK_SET); 48 lseek(fd2,pos,SEEK_SET); 49 50 51 int len=read(fd1,buf,sizeof(buf)); 52 write(fd2,buf,len); 53 close(fd1); 54 close(fd2); 55 return 1; 56 } 57 int create(char *src,char *des,int blocksize,int prono) 58 { 59 int i; 60 pid_t pid; 61 int pos=0; 62 for(i=0;i
0) 66 { 67 pos+=blocksize; 68 69 //printf("当前读取位置为:%d,每次所读文件大小:%d,当前进程为%d\n",pos,blocksize,getpid()); 70 71 } 72 73 else if(pid==0) 74 { 75 copy(src,des,pos,blocksize); 76 77 printf("当前读取位置为:%d,每次所读文件大小:%d,当前进程为%d\n",pos,blocksize,getpid()); 78 break; 79 } 80 81 } 82 return 1; 83 } 84 int main(int argc,char **argv) 85 { 86 int prono; 87 int blocksize; 88 if(argc<3) 89 { 90 printf("the canshu you have chuan are too less\n"); 91 } 92 if(argv[3]!=0) 93 { 94 prono=atoi(argv[3]); 95 if(prono<=0||prono>=100) 96 { 97 printf("the num of the process you give cant not less than 0 or more than 100\n"); 98 } 99 100 }101 else prono=5;102 blocksize=cutting (argv[1],prono);103 create(argv[1],argv[2],blocksize,prono);104 105 return 0;106 }

 

转载于:https://www.cnblogs.com/curo0119/p/8001509.html

你可能感兴趣的文章
字典类型
查看>>
vi查找
查看>>
CSS常见布局
查看>>
Unit02: HTML5 视频处理 、 音频处理
查看>>
RabbitMQ核心技术总结
查看>>
[BZOJ1406][AHOI2007]密码箱(数论)
查看>>
Markdown 完整语法中文版
查看>>
php 写model层
查看>>
【IEEE会议论文】格式规范问题
查看>>
LA 3713 Astronauts
查看>>
踩着的坑
查看>>
关于leetcode 二叉树的锯齿形层次遍历的几种解法
查看>>
Leetcode:Singel Number
查看>>
ucgui界面设计演示样例2
查看>>
在那名为無限螺旋的背后————
查看>>
2018刑侦科推理试题
查看>>
XShell上传和下载
查看>>
今天长进之redis的学习
查看>>
HDU 3374 String Problem
查看>>
电脑关机后自动重启
查看>>