`
xitong
  • 浏览: 6189278 次
文章分类
社区版块
存档分类
最新评论

多线程实现文件拷贝(Linux下C++)

 
阅读更多

我们应该都用过迅雷这种下载工具吧,迅雷下载工具中运用了多线程下载。多线程文件拷贝是实现多线程下载的基础,下面给出了多线程文件拷贝的实现代码:

//copyfile.cc
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;

/************************************
 *使用指定线程实现从文件的拷贝
 *创建时间:2011.07.28
 *修改时间:2011.07.29
 *作者:hahaya
 ***********************************/

//最大使用的线程数
const int MAX_THREADS = 5;

typedef struct TAG_INFO
{
    char *fromfile;                 //源地址
    char *tofile;                  //目的地址
    int num;                      //启动的第i-1个进程
}info;

//st_size的类型为__off_t
int get_size(const char *filename)
{
    struct stat st;
    memset(&st, 0, sizeof(st));
    stat(filename, &st);
    return st.st_size;
}

void* threadDL(void *param)
{
    info info1 = *((info*)param);
    
    FILE *fin = fopen(info1.fromfile, "r+");
    FILE *fout = fopen(info1.tofile, "w+");

    int size = get_size(info1.fromfile);
    //将文件指针分别设置在每个线程要读和写的位置 
    fseek(fin, size*(info1.num)/MAX_THREADS, SEEK_SET);
    fseek(fout, size*(info1.num)/MAX_THREADS, SEEK_SET);

    char buff[1024] = {'\0'};
    int len = 0;
    int total = 0;
    while((len = fread(buff, 1, sizeof(buff), fin)) > 0)
    {
	fwrite(buff, 1, len, fout);
	total += len;
	//如果读入的数据大于文件总大小除线程总数则停止读入,因为每个线程要读或写的数据就等于文件总大小除线程总数
	//可能会多写入一些数据,下一次写入时会覆盖多写入的数据,所以不用担心
	if(total > size/MAX_THREADS)
	{
	    break;
	}
    }

    fclose(fin);
    fclose(fout);

}

int main(int argc, char *argv[])
{
    //先创建一个与文件1同样大小的文件
    creat(argv[2], 0777);
    truncate(argv[2], get_size(argv[1]));

    pthread_t pid[MAX_THREADS];
    info info1;
    //启动指定线程数的线程
    for(int i = 0; i < MAX_THREADS; i++)
   {
        memset(&info1, 0, sizeof(info1));
	info1.fromfile = argv[1];
	info1.tofile = argv[2];
	info1.num = i;
	pthread_create(&pid[i], NULL, threadDL, (void*)&info1);
    }
    //等待线程结束
    for(int j = 0; j < MAX_THREADS; j++)
    {
	//pthread_join不能用在创建进程的for循环中,否则创建第一个进程后会等待第一个进程结束后创建第二个进程
	pthread_join(pid[j], NULL);
    }

    cout << "file copy success......" << endl;
    return 0;
    
}


程序运行截图:



复制后的文件是完整的,可以解压,如下图:




分享到:
评论

相关推荐

    mtc_多线程并发拷贝程序.zip_linux_research965_showacj_多线程并发_拷贝

    多线程并发拷贝工具 使用C++实现,需要C++11标准支持。 Visual Studio尽量使用2012或更高编译器(VC 6.0采用的是旧版C++标准); gcc 需要打开C++11编译选项。

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    在linux编写C++服务器程序的框架.zip

    主要是在linux编写C++程序的框架,包括文件的操作(文件的拷贝、删除、移动、大小、行数)和文件夹的操作(创建、删除、移动、包含多少文件),字符串的分隔、去掉空格,文件夹下多少文件,创建日志文件和配置文件(.ini)...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户...

    vc++ 开发实例源码包

    FTP、HTTP 多线程断点续传下载文件 源码 如题。 gdiplus应用实例 如题,自绘控件的实现。 gdiplus应用实例2 如题,自绘控件的实现。 GetFileVersion 这个例子就是查询任何可执行文件的版本信息并且 C++builder 和...

    vc++ 应用源码包_6

    多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取...

    基于FFmpeg (6.x)的流媒体处理工具,可以接收远程媒体流或者本地媒体文件,音视频编解码,发布流媒体 开发中

    基于FFmpeg (6.x)的流媒体处理工具是一款功能强大且灵活的多媒体处理应用程序... - 高性能I/O:使用多线程、零拷贝等技术,优化输入输出流的处理效率。 - 跨平台支持:以C/C++开发,可编译为Linux和MacOS版本,未来也可移植

    vc++ 应用源码包_1

    多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取...

    vc++ 应用源码包_2

    多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取...

    vc++ 应用源码包_5

    多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取...

    vc++ 应用源码包_3

    多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    程序员必备知识点整理包括编程、面试、刷题等

    17) C++11 并发与多线程 18)binder通信 19)LInux 1.12 C++ 基础必备: 1)内联函数和宏定义的区别?(*****) 2)sizeof size length 3)准备 5). 网络编程 6)、++i和i++深入分析 7) 数组的地址++ 8)bool, int, ...

    Python Cookbook

    17.5 在多线程环境中使用SWIG生成的模块 603 17.6 用PySequence_Fast将Python序列转为 C数组 604 17.7 用迭代器逐个访问Python序列的元素 608 17.8 从Python可调用的C函数中返回None 611 17.9 用gdb调试动态载入...

    服务器概要设计说明.docx

    连接生命周期的管理 C++语言没有对象回收〔GC〕机制,生命周期的管理和防止内存泄露需要程序自己实现,而一条连接从产生后到销毁的过程中会有多个线程同时对其进行操作,同时读写甚至同时关闭,对象的多线程同步也需要...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    新版Android开发教程.rar

    • Linux (tested on Linux Ubuntu Dapper Drake) Supported Supported Supported Supported Development Development Development Development Environments Environments Environments Environments Eclipse IDE o...

    Python访问Mysql数据库

    这些平台包括Linux、Windows、FreeBSD、Macintosh、 Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/ OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、Vx- Works、PlayStation、Sharp Zaurus、Windows CE 甚至...

Global site tag (gtag.js) - Google Analytics