Создание массива целых, видимых для дочерних процессов, используя mmap

Я работаю над проблемой столового философа и не могу использовать потоки, поэтому мне нужно использовать общую память, чтобы сделать массив палочек для еды и философов видимым для всех дочерних процессов. Я пытаюсь использовать mmap, однако, я неправильно использую mmap, и я не уверен, как это исправить, поскольку мой аргумент - это массив целых чисел, а не int согласно этому вопросу. Должен ли я использовать другую функцию, чтобы сделать это в общей памяти?

(declared at the global scope)
int chopsticks[5];
int sizeOfSticks=sizeof(int)*5;
void* map = mmap(0,sizeOfSticks,PROT_READ|PROT_WRITE, MAP_SHARED,chopsticks,0);

1 ответ

Решение

Второй до последнего аргумент mmap() дескриптор файла, для случаев, когда вы отображаете файл в память Если вам просто нужно выделить некоторую общую память, сделайте это вместо этого:

int *chopsticks;

...

chopsticks = mmap(NULL, N_CHOPSTICKS*sizeof(int),
                  PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED,
                  -1, 0);

MAP_ANONYMOUS означает, что отображение не имеет соответствующего файла. Проходя 0 для fd вероятно, тоже будет работать, но -1 может быть более переносимым (см., например, mmap(2) справочная страница по Linux).

Отображение будет наследоваться fork(2)Дочерние процессы.

В качестве небольшого примечания стиля вы можете написать N_CHOPSTICKS*sizeof(*chopsticks) вместо N_CHOPSTICKS*sizeof(int), Таким образом, размер будет по-прежнему правильным, даже если вы измените тип chopsticks,

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