Что является хорошим переносимым способом реализации глобального сигнализируемого события в среде POSIX - PullRequest
2 голосов
/ 01 декабря 2010

Вариант использования: одно приложение генерирует событие и отправляет сигнал, который получит любое приложение, которое хочет его прослушать. Например. приложение обновляет содержимое файла и сигнализирует об этом. В Linux это могут сделать официанты, вызывающие inotify для файла. Одним из портативных способов было бы для слушателей зарегистрироваться на известном сервере, но я бы предпочел что-то более простое, если это возможно. В максимально возможной степени портативно означает использование только тех функций POSIX, которые также широко доступны.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Опция с использованием файлов блокировки

Вы можете сделать это, заблокировав файл.

Начальная настройка излучателя сигнала:

  • Создайте файл с хорошо известным именем и заблокируйте его для записи (fcntl(F_SETLK) с F_WRLCK или flock (LOCK_EX) `).

Процедура приема сигнала:

  • Откройте файл, используя известное имя файла, и попытайтесь установить для него блокировку чтения (fcntl(F_SETLK) с F_RDLCK или flock(LOCK_SH)).
  • Блоки приемника, потому что эмиттер держит конфликтующую блокировку записи.

Излучение сигнала:

  • Генератор сигналов создает новый временный файл
  • Излучатель сигнала получает блокировку записи для нового временного файла
  • Генератор сигналов переименовывает новый временный файл в хорошо известное имя файла. Это забивает старый файл блокировки, но все ожидающие получатели сохраняют ссылки на него.
  • Генератор сигналов закрывает старый файл блокировки. Это также снимает блокировку.
  • Все получатели сигналов просыпаются, потому что теперь они могут получить свои блокировки чтения.
  • Получатели сигнала должны закрыть файл, к которому они только что получили блокировку. Это не будет использоваться снова. Если они хотят дождаться повторения условия, они должны снова открыть файл.

В источнике сигнала временный файл блокировки, который был переименован поверх исходного файла блокировки, теперь становится новым текущим файлом блокировки.

Опция использования многоадресной сети

Пусть получатели присоединятся к многоадресной группе и будут ждать пакеты. Пусть передатчик сигнала отправит пакеты UDP этой группе многоадресной рассылки.

Вы можете привязать и отправляющий и принимающий сокеты UDP к интерфейсу обратной связи, если вы хотите, чтобы он использовал только локальную связь с хостом.

0 голосов
/ 26 сентября 2014

В конце концов я использовал связанный сокет unix domain. Владелец хранит массив клиентских FD и отправляет каждому сообщение, когда происходит событие.

...