#define __THR_CNT__ 5 //线程数
typedef struct CopyFileObj{
int num;
char *copySrc;
char *copyDst;
int size;
}CopyObj;
void * thrFun(void *arg)
{
CopyObj *info =(CopyObj *)arg;
int num = info->num;
int casize = info->size/__THR_CNT__;
int mod = info->size%casize;
if(num == (__THR_CNT__ -1))
memcpy(info->copyDst+num*casize,info->copySrc+num*casize,casize+mod);
else
memcpy(info->copyDst+num*casize,info->copySrc+num*casize,casize);
pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("err: app srcFile dstFile\n");
exit(1);
}
int fd_src = open(argv[1],O_RDWR);
if(fd_src < 0)
{
perror("open src \n");
exit(2);
}
int fd_dst = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);
if(fd_dst < 0)
{
perror("open dst \n");
exit(2);
}
int src_l = lseek(fd_src,0,SEEK_END);
int ret;
if ((ret =ftruncate(fd_dst,src_l))<0) {
perror("ftruncate \n");
exit(3);
}
char* mp_src = (char*)mmap(NULL,src_l,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_src,0);
if(mp_src == MAP_FAILED)
{
perror("mp_src err");
return -1;
}
close(fd_src);
char* mp_dst = (char*)mmap(NULL,src_l,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_dst,0);
if(mp_dst == MAP_FAILED)
{
perror("man err");
return -1;
}
close(fd_dst);
CopyObj tempObj[__THR_CNT__];
// 创建线程
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
pthread_t tid[5];
int i;
for (i = 0; i < __THR_CNT__; ++i) {
tempObj[i].copySrc = mp_src;
tempObj[i].copyDst = mp_dst;
tempObj[i].num = i;
tempObj[i].size = src_l;
pthread_create(&tid[i],&attr,thrFun,&tempObj[i]);
}
pthread_attr_destroy(&attr);
pthread_exit(NULL);
munmap(mp_src,src_l);
munmap(mp_dst,src_l);
原文:https://www.cnblogs.com/lodger47/p/14738732.html