线程安全文件副本

时间:2015-04-06 01:07:56

标签: c multithreading file unix pthreads

我正在尝试编写一个将多个文件备份到名为.backups的文件夹的程序。它为每个文件或子目录创建一个线程,该线程负责复制操作。但它无法正常工作。有时文件永远不会被复制,有时它们只有0个字节,有时它可以正常工作。它似乎完全随机,我不知道是什么导致它。任何人都可以帮我搞清楚吗?

// Copies the file from source to destination and returns number of bytes written
ssize_t copy_file(char* from, char *to)
{
    const int BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];
    ssize_t n;
    ssize_t written = 0;
    FILE* file_from = fopen(from, "r");
    FILE* file_to = fopen(to, "w");

    if (file_from == NULL || file_to == NULL)
        return -1;

    while ((n = fread(buffer, 1, BUFFER_SIZE, file_from)) > 0) {
        if (fwrite(buffer, sizeof(char), n, file_to) != n)
            return -1;
        written += n;
    }
    return written;
}


// Thread responsible for handling the backup of a single file or subdirectory
void* backup_thread(void* arg)
{
    struct backup_info* info = (struct backup_info*) arg;
    ssize_t written;

    written = copy_file(info->file, info->destination);

    int rc = pthread_detach(pthread_self());
    if (rc != 0)
        exit(EXIT_FAILURE);

    free(info);
    return NULL;
}

编辑:另外,这就是我创建每个线程的方式。

 struct backup_info* info = malloc(sizeof(struct backup_info));


 if ((rc = pthread_create(&thread_id, NULL, backup_thread, info)) != 0)
        fprintf(stderr, "pthread_create() failed (%d): %s", rc, strerror(rc));

2 个答案:

答案 0 :(得分:2)

主线程如何退出?

如果它只是从main()返回,那么这与调用exit()相同,并且会导致所有其他线程在他们碰巧正在做的任何事情中被毫不客气地杀死。< / p>

如果你在pthread_exit()中明确地调用main(),那么分离的线程将被允许在进程退出之前完成。

另请注意exit(EXIT_FAILURE)中的backup_thread()具有相同的问题 - 如果错误情况触发,则会立即拆除整个过程。此处也可以更好地使用pthread_exit()

答案 1 :(得分:0)

我发现可能导致问题的错误。您永远不会在任何文件上拨打fclose()。这最终将导致使用所有文件描述符(在您的线程之间共享)。我不知道这是否是唯一的错误,但你应该做出修复,看看会发生什么。