sem_close против sem_unlink, когда процесс завершается - PullRequest
3 голосов
/ 02 марта 2012

У меня есть несколько процессов, взаимодействующих с помощью семафора.

sem_open("\name",O_CREATE,S_IRWXU|S_IRWXG,10);

У меня есть 2 вопроса со следующими вопросами:

  1. Теперь, когда один процесс внезапно умирает без вызова sem_close или sem_unlink. Что происходит с остальными процессами?

  2. Если вызывается sem_close (), то sem_unlink () не вызывается для 1 процесса. Все остальные процессы вызывают sem_close () и sem_unlink (). Семафор все еще существует после завершения всех процессов?

1 Ответ

5 голосов
/ 23 февраля 2014

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

  1. когда процесс умирает, добровольно или недобровольно, операция sem_close происходит автоматически.
  2. Нет, семафор не существует, если вышли все процессы, у которых был открыт семафор, и хотя бы один процесс вызвал sem_unlink.

Чтобы немного расширить: sem_unlink удаляет именованный семафор и уничтожает семафор, когда его счетчик ссылок равен 0. То есть после того, как весь открывший его процесс вызвал sem_close или вышел

Ссылки: Книга - Unix Networking Programming-Interprocess Communication от W.Richard Stevens, том 2, ch10

...