题目要求:
设计程序,使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比实现;
例如:将/home/XXX 复制 /home//dir,提示:XXX文件已复制20%,XXX文件已复制50%,.....,XXX文件已复制100%,xxx文件复制完成!
源码:
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
struct file
{
char src[1024];
char dest[1024];
};
void* my_cp(void *argv)
{
struct file f = *((struct file*)argv);
int rfd,wfd,ret;
struct stat temp;
stat(f.dest,&temp);
char *p = strrchr(f.src,'/');
if(S_IFDIR & temp.st_mode){ //如果目标是一个文件夹
//将源的文件名拼接在目标字符串上
strcat(f.dest,p);
}
//将要读取的文件打开(源,需复制文件)
rfd = open(f.src,O_RDONLY);
if(rfd < 0){
perror("open read");
pthread_exit(NULL);
}
//将要写入的文件打开
umask(0);
wfd = open(f.dest,O_CREAT|O_WRONLY|O_TRUNC,0777);
if(wfd < 0){
perror("open write");
pthread_exit(NULL);
}
pthread_mutex_unlock(&mutex);//解锁
stat(f.src,&temp);
int size = temp.st_size;
char buff[1024];
int sum = 0;
while(1){
ret = read(rfd, buff, 1024);
if(ret<0){//读取失败
perror("read");
break;
}
else if (ret == 0){//到达文件结尾
break;
}
ret = write(wfd, buff, ret); //将读到的数据写入文件
sum += ret;
printf("%s已复制%.2f%%\n",p+1,(float)sum/size*100);
if(ret < 0){
perror("write");
break;
}
}
close(rfd);
close(wfd);
pthread_exit(NULL);
}
int main(int argc, char* argv[])
{
if(argc < 3 || argc%2 != 1){
printf("参数错误\n");
return -1;
}
pthread_t pth[argc/2];
struct file* p = (struct file*)malloc(sizeof(struct file));
for(int i = 1; i <= argc/2; i++){
pthread_mutex_lock(&mutex);//加锁,每一个进程都要使用p中数据,不互斥,会产生混乱
strcpy(p->src,argv[2*i-1]);
strcpy(p->dest,argv[2*i]);
if(0 != pthread_create((pth+(i-1)),NULL,my_cp,p)){
perror("pthread_create");
return -1;
}
}
for(int i = 0; i < argc/2; i++){
pthread_join(pth[i],NULL);
}
return 0;
}