• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: C/C++
  • 标签: C语言  多线程  

资源简介

本人在工作用的到c语言进程多线程工作,和多线程实现文件传输的功能,就网上寻找一份,供大家参考

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define THREADS_COUNT 4
#define THREADS_BUFF_SIZE 1*1024
struct thread_block
{
    int infd; ///源文件句柄
    int outfd;//目的文件句柄
    size_t start;///文件的写入起始位置
    size_t end; ///文件写入的终止位置
};

void usage()
{
    printf(“copy %%src %%dst\n“);
}
///获取文件大小
size_t get_filesize(int fd)
{
    struct stat st;
    fstat(fd&st);
    return st.st_size;
}
void *thread_copy_fn(void *arg)
{
    struct thread_block *block = (struct thread_block *)arg;
    char buf[THREADS_BUFF_SIZE];    
    int ret;
    size_t count = block->start;

    printf(“In Thread\t%ld\nstart = %d\t end = %d\n“\
            pthread_self()block->startblock->end);

    ///lseek到同样的位置
    ret = lseek(block->infdblock->startSEEK_SET);
    ret = lseek(block->outfdblock->startSEEK_SET);
    int bytes_read;
    int bytes_write;
    while(count < block->end)
    {
        bytes_read = read(block->infdbufsizeof(buf));
        if(bytes_read >0)
        {
            printf(“thread = %ld\t read = %d\t count %d\n“\
                    pthread_self()bytes_readcount);
            count += bytes_read;

            //read()返回-1,同时errno为EINTR,表示读的过程中遇到了中断
            if((bytes_read == -1)&&(errno !=EINTR))
                    break;
            char *ptr_write = buf;
            while((bytes_write = write(block->outfdptr_writebytes_read))!=0)
            {
                //write()会返回-1,同时errno为EINTR,表示在写的过程中遇到了中断
                if((bytes_write == -1)&&(errno!=EINTR))
                    break;
                if(bytes_write == bytes_read)
                    break;
                else if(bytes_write > 0)
                {
                    ptr_write += bytes_write;
                    bytes_read -= bytes_write;
                }
                printf(“thread = %ld\t write = %d\t read %d\n“\
                    pthread_self()bytes_writebytes_read);
            }//end-write;
            ///error while write
            if(bytes_write == -1)
                break;
            
        }
    }
    printf(“#####Thread exit %ld#####\n“pthread_self());
    pthread_exit(NULL); 

int main(int argcchar *argv[])
{
    if(argc < 3)
    {
        usage();    
        return -1;
    }
    ///打开文件
    int infd = open(argv[1]O_RDONLY);
    int outfd = open(argv[2]O_CREAT|O_WRONLY0644);
    // 0644也就是-文件所有者有读写权限,组有读权限,其他用户有读权限
    if(infd == -1|| -1 ==outfd)
    {
        printf(“error while open file \n“);
        return -1;
    }
    size_t file_size = get_filesize(infd);

    size_t thread_size = THREADS_COUNT;
    struct thread_block *blocks = (struct thread_block *)
        malloc(sizeof(struct thread_block )* thread_size);
    size_t percent = file_size / thread_size;
    printf(“filesize = %d\t percent_blocks = %d\n“\
            file_sizepercent);
    int i = 0;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        383  2014-06-11 17:00  C实现多线程下载源码\readme.txt.txt

     文件       3911  2014-06-11 16:07  C实现多线程下载源码\thread_download.c

     目录          0  2014-06-11 16:59  C实现多线程下载源码

----------- ---------  ---------- -----  ----

                 4294                    3


评论

共有 条评论