Проблема с отображением в mmap и нескольких процессах

В первый раз, используя mmap, у меня есть программа, которая создает файл и делится им, чтобы другая программа могла получить к нему доступ. Вот как я его инициализировал в моем основном:

    //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.

Я предполагаю, что я либо создаю, либо открываю файл неправильно, чтобы учесть все запросы на чтение / запись, но я не уверен, что нужно изменить. Любое понимание того, как решить эту проблему?

Редактировать: Оказывается, fileSize в файле Sort.c получает 0 от процессов 5-10, поэтому он вызывает неверные аргументы, но я до сих пор не знаю, почему он передает fileSize 0 для этих процессов.

0 ответов

Другие вопросы по тегам