0

我编写了一个 c++ 代码来多线程将文件复制到 linux 中的另一个目录。但不起作用(只是它在目录中创建了一个空文件)。

我不知道有什么问题?我认为我的胎面无权写入共享文件。但不知道我该怎么办。

在终端输入时它应该可以工作:

$./a.out <file name> <dir> <thread number (default 4)>

这是我的代码:

/*Multithreads file copier*/

#include <fcntl.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <sys/sendfile.h>
#include <unistd.h>
#include <cstdio> 


char* file;
char* fileout_path;
int fin, fout;

// part of each thread
struct PART{
    off_t* offset =0;
    size_t size;
};

//multithreading 
void *Copy (void *  data)
{
    struct PART *mypart;
    mypart = (struct PART *) data;
//open file to read and write 
    fin = open(file, O_RDONLY,0);
    fout = open(fileout_path, O_WRONLY|O_CREAT, 0644);
    unsigned long a = static_cast<unsigned long>(mypart->size);
    lseek(fout, a, SEEK_SET); //set offset by size of the part
//use sendfile instead read and write to easier code
    sendfile(fin, fout, mypart->offset, mypart->size);
     printf("threading....\n");//to know the thread ran
     pthread_exit(0);
}



int main(int argc, char *argv[])
{
    int threads_number;
    if (argv[3]!= NULL)
    {
    threads_number = atoi(argv[3]);
    }
    else
    {
    threads_number = 4;//default thread number 
    }
//multithreading datatypes
    pthread_t tid[threads_number];
    pthread_attr_t attr;
    pthread_attr_init(&attr);

    struct stat f_stat;
    struct PART part[threads_number];
    
//allocation size of each part
    unsigned long part_size = f_stat.st_size / threads_number;
   
    for(int i =0; i <number_threads; i++)
    {
        if ( i == threads_number -1)
        {
            part[threads_number].size = f_stat.st_size - (part_size * (threads_number -1));
        }
        else
        {
            part[i].size = part_size;
        }
      
        
    }
    
   
    
    
    file = argv[1];
    stat(file, &f_stat);    
    fileout_path = argv[2];

    
int fin1 = open(file, O_RDONLY,0);
    int fout1 = open(fileout_path, O_WRONLY|O_CREAT, 0644);
   
   
    for (int j = 0; j < threads_number; j++)
    {
        pthread_create(&tid[j], NULL, Copy, (void *)&part[j]);
        pthread_join(tid[j],NULL);
    }
 

        printf("thread is done.\n");
        close(fout);
        close(fin);

        return 0;
}


4

0 回答 0