2010-12-01 3 views
2

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

ответ

1

Вариант с использованием блокировки файлов

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

сигнал эмиттера начальной установки:

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

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

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

сигнала:

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

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

Вариант с использованием сети многоадресного

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^