c语言,多线程实现多个文件同步复制功能

题目要求:

        设计程序,使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比实现;

        例如:将/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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值