Когда нужно позвонить sem_unlink()?

Я немного смущен Linux-интерфейсом sem_unlink(), в основном, когда или почему его называют. Я использовал семафоры в Windows уже много лет. В Windows после закрытия последнего дескриптора именованного семафора система удаляет основной объект ядра. Но в Linux вам, разработчику, нужно удалить объект ядра, вызвав sem_unlink(). Если вы не сохраняете объект ядра в папке /dev/shm.

Проблема, с которой я сталкиваюсь, если процесс A вызывает sem_unlink(), в то время как процесс B блокирует семафор, он немедленно уничтожает семафор, и теперь процесс B больше не "защищен" семафором, когда/если процесс C приходит вдоль. Что еще, справочная страница сбивает с толку в лучшем случае:

"Имя семафора немедленно удаляется. Семафор уничтожается, как только все остальные процессы, у которых открыт семафор, закрывают его.

Как он может немедленно уничтожить объект, если ему придется ждать, пока другие процессы закрывают семафор?

Ясно, что я не понимаю правильное использование объектов семафора в Linux. Спасибо за любую помощь. Ниже приведен пример кода, который я использую для проверки этого.

int main(void)
{
    sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1);
    if(pSemaphore != SEM_FAILED)
    {
        if(sem_wait(pSemaphore) == 0)
        {
            // Perform "protected" operations here

            sem_post(pSemaphore);
        }

        sem_close(pSemaphore);
        sem_unlink("/MyName");
    }

    return 0;
}

Ответ 1

Ответ на ваши вопросы:

  • По сравнению с поведением семафора для окон вы описать, семафоры POSIX являются постоянными ядром. Это означает, что семафор сохраняет значение, даже если ни один процесс не имеет семафора открыт. (счетчик ссылок семафора будет 0)

  • Если процесс A вызывает sem_unlink(), тогда как процесс B имеет семафор заперта. Это означает, что счетчик ссылок семафора не равен 0 и будет не разрушаться.

Основная операция sem_close vs sem_unlink, я думаю, поможет в общем понимании:

sem_close: закрыть семафор, это также делается, когда процесс завершается. семафор все еще остается в системе.

sem_unlink: будет удаляться из системы только тогда, когда счетчик ссылок достигнет 0 (то есть после всех процессов, которые его открыли, вызывают sem_close или выходят).

Литература: Book - Unix Networking Programming-Interprocess Communication от W.Richard Stevens, vol 2, ch10

Ответ 2

Функция sem_unlink() удаляет семафор, идентифицированный именем и метками семафор, который будет уничтожен, когда все процессы перестанут его использовать (это может означать немедленно, если все процессы, у которых открыт семафор, уже закрыли его).