linux多线程实现文件复制

本文介绍了一种使用多线程和mmap内存映射进行高效文件复制的方法。通过直接操作文件描述符和内存映射,实现了比传统文件复制更快的速度。代码示例展示了如何在C语言中实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写过一个多进程copy文件,是直接通过操作文件描述符来做的,链接如下https://blog.youkuaiyun.com/woshichaoren1/article/details/84800807

此次多线程copy文件是用mmap内存映射操作,读写速度要快一些。废话不多说直接上代码

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
struct param
{
    int legth;      //长度
    int offset;     //lseek位置
    char src[255];  //源文件位置
    char des[255];  //目的文件位置
};

void* copyContext(void *arg)
{
    param *myparam = (param*)arg;
    int fd_src = open(myparam->src,O_RDONLY);
    int fd_des = open(myparam->des,O_RDWR);
    char *s_addr = (char*)mmap(NULL,myparam->legth,PROT_READ,MAP_SHARED,fd_src,myparam->offset);
    char *d_addr = (char*)mmap(NULL,myparam->legth,PROT_READ|PROT_WRITE,MAP_SHARED,fd_des,myparam->offset);

    //copy
    memcpy(d_addr,s_addr,myparam->legth);

    return NULL;
}



int main(int argc,char *argv[])
{
    if(argc <4)
    {
        printf("please input like this : copy srcfile, descfile , pthreadnum\n");
    }
    pthread_t *tid;
    param *params;
    params = (param *)malloc(atoi(argv[3])*sizeof(param));
    tid = (pthread_t *)malloc(atoi(argv[3])*sizeof(pthread_t));
   // params = new param[argc];
   // tid = new pthread_t[argc];
    int fd = open(argv[1],O_RDONLY);
    if (fd<0)
    {
        perror("open src filed:");
        exit(errno);
    }
    umask(000);
    int fd2 = open(argv[2],O_RDWR|O_CREAT,0777);
    if(fd2<0)
    {
        perror("open des filed:");
        exit(errno);
    }
    int filesize = lseek(fd,0,SEEK_END);

    //先初始化大小为一样
    lseek(fd2,filesize-1,SEEK_SET);
    write(fd2,"0",1);

    //初始化变量
    int offset = filesize/argc + (filesize%argc?0:1);
    for (int i = 0; i <argc ; ++i) {
        params[i].legth = filesize;
        params[i].offset = i*offset;
        strcpy(params[i].src ,argv[1]);
        strcpy(params[i].des ,argv[2]);
    }

    //创建线程
    for (int i = 0; i <atoi(argv[3]) ; ++i) {
        pthread_create(&tid[i], NULL,copyContext,&params[i]);
    }

    //给子线程收尸
    for (int j = 0; j < atoi(argv[3]); ++j) {
        pthread_join(tid[j],NULL);
    }

    return 0;

}

之前因为没注意用的new来写的 new是c++的函数,一直报new的错。。。望注意⚠️ 

代码有一些细节没写。。比如cp后文件访问权限与源文件的不同,还有命令参数不符等错误没有抛出异常。。。。有兴趣的自己写下吧。如有错误望指出

你可以使用 Linux shell 的 `rsync` 命令实现多线程复制文件的脚本。`rsync` 是一个功能强大的文件复制工具,支持多线程复制和增量复制。 以下是一个简单的示例脚本,可以在 Linux shell 中运行: ```shell #!/bin/bash # 源文件目录 source_dir="/path/to/source" # 目标文件目录 target_dir="/path/to/target" # 并发线程数 threads=4 # 复制文件 rsync -r --progress --human-readable --stats --partial --info=progress2 --inplace --files-from=<(cd $source_dir && find . -type f) $source_dir $target_dir --parallel=$threads ``` 在脚本中,你需要修改 `source_dir` 和 `target_dir` 变量为你实际的源文件目录和目标文件目录。同时,你可以根据需要调整并发线程数 `threads`。 脚本中使用了 `rsync` 命令的多个参数,具体含义如下: - `-r`:递归复制文件夹及其内容。 - `--progress`:显示复制进度。 - `--human-readable`:以人类可读的方式显示进度。 - `--stats`:显示复制统计信息。 - `--partial`:支持断点续传。 - `--info=progress2`:显示更详细的进度信息。 - `--inplace`:直接在目标位置进行修改,而不是创建临时文件。 - `--files-from=<(cd $source_dir && find . -type f)`:从源文件目录中的文件列表中复制文件。 - `$source_dir` 和 `$target_dir`:源文件目录和目标文件目录。 - `--parallel=$threads`:指定并发线程数。 请注意,`rsync` 命令复制过程中会自动检测已复制文件,只复制有变化的部分,以实现增量复制。 希望这个示例能帮助到你!如果有任何问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值