Почему 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()следовательно, вы можете использовать одну и ту же переменную как в родительском, так и в дочернем элементах для доступа к названному семафору.

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