您的位置:首页 > 其它

多线程同时上传文件的实现

2016-09-26 21:58 330 查看


首先需要一个结构体

这个结构体应当拥有

(1)源文件的句柄

(2)目标文件的句柄

(3)写文件的起始位置

(4)写文件的终止位置



每一个结构体代表了文件的一部分

如果说把文件分成了5份,那就应该定义5个结构体,然后求出文件的大小,把文件的大小分成五份,

然后记录这一部分应当从文件的何处拷贝到何处,以及目标文件和源文件的句柄



开始定义线程内的函数,通过lseek函数找到应当找到的位置

然后开始拷贝就好了

以下是我参照别人代码自己实现的多线程拷贝,但不知道为什么有时候会拷贝失误一下下,但是总体是ok的

#include <pthread.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

#define THREAD_BUFF_SIZE 1024

typedef struct filePart
{
size_t start;
size_t end;
int infd;//源文件
int outfd;//目的
}filePart;

void* transFile(void* arg)
{
filePart* block = (filePart*)arg;
char buf[THREAD_BUFF_SIZE];
int ret;
//  size_t count = block->start;

ret = lseek(block->infd,block->start,SEEK_SET);
ret = lseek(block->outfd,block->start,SEEK_SET);

int size = 0;
while((size = read(block->infd,buf,sizeof(buf)))>0)
{
write(block->outfd,buf,size);
}
pthread_exit(NULL);

}

size_t get_filesize(int fd)
{
struct stat st;
fstat(fd,&st);
return st.st_size;

}

int main(int argc,char* argv[])
{
if(argc<2)
{
printf("Wrong!");
return -1;
}

int infd = open(argv[1],O_RDONLY);
int outfd = open(argv[2],O_CREAT|O_WRONLY,0644);

size_t file_size = get_filesize(infd);

int n = 5;//设置五份

filePart* blocks = (filePart*)malloc(sizeof(filePart)*n);
int i = 0;
size_t percent = file_size/n;

for(;i<n;++i)
{
blocks[i].infd = infd;
blocks[i].outfd = outfd;
blocks[i].start = i*percent;
blocks[i].end = blocks[i].start + percent;
}

blocks[i].end = file_size;

pthread_t ptid[5];

for(i = 0 ; i < n; ++i)
{
pthread_create(&ptid[i],NULL,transFile,&(blocks[i]));
}
for(i = 0 ; i < n; ++i)
{
pthread_join(ptid[i],NULL);
}
//释放资源
free(blocks);
close(infd);
close(outfd);
printf("Copy Successfully \n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: