Почему sem_open работает с fork() без разделяемой памяти?
Эта программа работает (я проверял это), хотя семафор не находится в общей памяти. Обратите внимание, как я создаю переменную один раз - перед fork().
С другой стороны, семафор, созданный с sem_init()
должен быть в общей памяти, чтобы работать. Но это все еще sem_t
структура, так почему же она не требует общей памяти?
Являются ли содержимое sem_t
structure somehow different?
sem_t *s = sem_open("mysemaphore1", O_CREAT, 0600, 0);
if (fork()) {
sleep(3);
sem_post(s);
} else {
sem_wait(s);
printf("Woke\n");
}
1 ответ
Семафор, созданный sem_open()
это семафор с именем Основное назначение именованного семафора - использовать его между несвязанными процессами. Семафор, созданный sem_init()
это безымянный семафор. Это более легкий вес, чем указанный семафор, и его необходимо поместить в общую память, если он используется между связанными процессами. Если используется между потоками одного и того же процесса, он может храниться в глобальной переменной.
Указатель, возвращаемый sem_open()
на самом деле указатель на память, отображаемую mmap()
с MAP_SHARED
флаг установлен. Так как такой вид памяти сохраняется через fork()
следовательно, вы можете использовать одну и ту же переменную как в родительском, так и в дочернем элементах для доступа к названному семафору.