使用mmap和多个进程映射问题

时间:2014-02-19 18:59:05

标签: c exec multiprocessing shared-memory mmap

第一次使用mmap并且我有一个程序可以创建一个文件并共享它,以便另一个程序可以访问它。以下是我在main中初始化它的方法:

    //Main.c
    file = open(FILE_PATH, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
    result = lseek(file, FILE_SIZE-1, SEEK_SET);
    result = write(file, "", 1);
    map = mmap(0, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0);

注意我省略了错误检查以简化代码长度。打开成功后,我正在为文件写一个大约五十万个整数的数组,然后分叉一个排序程序的多个实例来对数组的部分进行排序。每个子进程都传递给数组的一个单独部分(Sindex和EIndex总是在变化)。

for (i=0; i < 10; i++) {
    if ((proccessIdArray[i] = fork()) < 0) {
        perror("fork");
    } else if (proccessIdArray[i] == 0){     
        execl("mysort", FPATH, FSIZE, ARRAYSIZE, SIndex, EIndex, (char *)NULL); 
        perror("exec"); 
        exit(0);
    } 
} 

以下是我在排序程序中打开文件的方法:

    //Sort.c
    file = open(argv[0], O_RDWR);
    map = mmap(0, fileSize, PROT_WRITE, MAP_SHARED, file, 0);
    if (map == MAP_FAILED) { // It is failing here for child processes 5-10
        close(file);  
        perror("Error mapping file");
        exit(EXIT_FAILURE);
    }
    .
    .
    // sorting code
    .
    .
    munmap(map, fileSize);
    close(file);

它可以运行最多4个进程,但是超过4的任何东西都会返回错误:

Error mapping file: Invalid argument
Child 18225 status 0x100.
Child 18226 status 0xb.
Child 18227 status 0xb.
Child 18229 status 0xb.
Child 18230 status 0xb.
Child 18228 status 0xb.

我假设我要么错误地创建或打开文件以适应所有读/写请求,但我不确定需要更改什么。如何解决这个问题?

修改的: 事实证明,Sort.c文件中的fileSize从进程5-10获得0,这就是为什么它给出了无效的参数调用,但我仍然不知道为什么它为这些进程传递fileSize 0。

0 个答案:

没有答案