Проблема с отображением в 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 для этих процессов.