Создание массива целых, видимых для дочерних процессов, используя 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
,