C 多进程拷贝

i know this is very ugly, but just for fun.

#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>



int main(int argc, char **argv)
{
    char *src_file, *des_file;
    int src_fd = -1, des_fd = -1;
    int pid, i, ret, np, len, unit;
    int f_index, r_index;
    char *src_ptr = NULL, *des_ptr = NULL;

    np = 2;
    src_file = argv[1];
    des_file = argv[2];

    src_fd = open(argv[1], O_RDONLY);
    if (src_fd < 0) {
        perror("open");
        goto __end;
    }
    des_fd = open(argv[2], O_RDWR | O_CREAT, 0644);
    if (des_fd < 0) {
        perror("open");
        goto __end;
    }

    len = lseek(src_fd, 0, SEEK_END);
    lseek(src_fd, 0, SEEK_SET);

    src_ptr = (char *)mmap(NULL, len, PROT_READ, MAP_SHARED, src_fd, 0);
    if (src_ptr == MAP_FAILED) {
        perror("mmap src_ptr");
        goto __end;
    }
    if (ftruncate(des_fd, len) < 0) {
        perror("ftruncate");
        goto __end;
    }
    des_ptr = (char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, des_fd, 0);
    if (des_ptr == MAP_FAILED) {
        perror("mmap des_ptr");
        goto __end;
    }
    unit = len/np == 0 ? len : len/np;

    for (i = 0; i < np; i++) {
        pid = fork();
        if (pid == 0)
            break;
    }
    if (pid == 0) {
        f_index = i*unit;
        r_index = (i+1)*unit > len ? len : (i+1)*unit;
        memcpy(des_ptr + f_index, src_ptr + f_index, r_index - f_index);    
    }
    else {
        while (i) {
            if ((ret = waitpid(-1, NULL, 0))< 0)
                perror("waipid\n");
            else  {
                i--;
                printf("complete: %f\n", (np-i)/(float)np);
            }
        }

    }


__end:
    if (src_fd >= 0)
        close(src_fd);
    if (des_fd >= 0)
        close(des_fd);
    if (src_ptr != MAP_FAILED)
        munmap(src_ptr, len);
    if (des_ptr != MAP_FAILED)
        munmap(des_ptr, len);


    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yangxinrui/p/11182956.html