#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<cstdlib>
#include<sys/wait.h>
using namespace std;
int main(int argc, char * argv[])
{
int progress = 5;
struct stat buf;
int fd_r,fd_w;
pid_t pid;
char *p = new char;
int i=0;
fd_r = open(argv[1], O_RDONLY); //需要读取的文件
if(-1 == fd_r)
{
perror("open argv[1] error");
return -1;
}
stat(argv[1], &buf);
int len = buf.st_size;
//这里必须要有读权限,因为mmap进行映射的时候实际就是先读一次文件
fd_w = open(argv[2], O_RDWR | O_CREAT, 0644); //需要复制的文件
if(-1 == fd_w)
{
perror("open argv[2] error");
return -1;
}
if(truncate(argv[2], len) < 0) //给文件扩容
{
perror("truncate error");
return -1;
}
int each_size = len / progress;
int lase_size = len % progress;
p = (char *)mmap(NULL, len, PROT_WRITE , MAP_SHARED, fd_w, 0);
if( p == MAP_FAILED)
{
perror("mmap error");
return -1;
}
for(i=0; i<progress ;i++)
{
pid = fork();
if(pid == 0)
break;
if(pid < 0)
{
perror("fork error");
return -1;
}
}
if(i < 5)
{
if(i < 4)
{
int read_len = read(fd_r, p+i*each_size, each_size);
if(read_len != each_size)
{
perror("read error");
}
}
else
{
int last_len = read(fd_r, p+i*each_size, each_size+lase_size);
if(last_len != each_size+lase_size)
{
perror("lase one read error");
}
}
}
else
{
int n = progress;
do{
int status;
pid_t w_pid = waitpid(-1, &status,WNOHANG);
if(w_pid > 0)
n--;
}while(n>0); //回收子进程
cout<<"all progress finished\n";
close(fd_r);
close(fd_w);
munmap(p, len);
}
cout<<"copy file finish\n";
return 0;
}
总体思路是,把整个文件均分,然后每个子进程拷贝一部分,不过这个程序的做法似乎还有改进的空间,等以后做完了再贴出来给大家看