Пример использования: одно приложение генерирует событие и отправляет сигнал, который получит любое приложение, которое ему необходимо для прослушивания. Например. приложение обновляет содержимое файла и сигнализирует об этом. В Linux это может быть сделано официантами, вызывающими inotify в файле. Один переносной способ - это слушать слушателей на хорошо известном сервере, но я предпочел бы что-то более простое, если это было возможно. В качестве портативного, по возможности, идеально подходит использование только функций POSIX, которые также широко доступны.Что такое хороший переносимый способ реализации глобального сигнального события в среде POSIX
2
A
ответ
1
Вариант с использованием блокировки файлов
Вы можете сделать это путем блокировки файла.
сигнал эмиттера начальной установки:
- Создайте файл с хорошо известным именем и зафиксировать его для записи (
fcntl(F_SETLK)
сF_WRLCK
или стадом (LOCK_EX) `).
процедура Приемник сигнала:
- Откройте файл, используя хорошо известное имя файла и попытаться получить блокировку чтения на нем (
fcntl(F_SETLK)
сF_RDLCK
илиflock(LOCK_SH)
). - Приемник блокирует, поскольку эмиттер удерживает конфликтующий замок записи. излучение
сигнала:
- сигнала эмиттер создает новый временный файл
- излучатель сигнала получает блокировку записи на новый временный файл
- сигнала эмиттера переименовывает новый временный файл к хорошо известное имя файла. Это скрепляет старый файл блокировки, но ожидающие приемники все сохраняют ссылки на него.
- Сигнальный эмиттер закрывает старый файл блокировки. Это также освобождает блокировку.
- Сигнальные приемники все просыпаются, потому что теперь они могут получить свои считывающие замки.
- Сигнальные приемники должны закрыть файл, в котором они только что получили блокировку. Он больше не будет использоваться. Если они хотят дождаться повторения этого условия, они должны снова открыть файл.
В сигнальном эмиттере временный файл блокировки, который был переименован поверх исходного файла блокировки, теперь становится новым текущим файлом блокировки.
Вариант с использованием сети многоадресного
Есть приемники присоединиться к группе многоадресной рассылки и ждать пакетов. Имейте излучатель сигнала отправляет UDP-пакеты в эту группу многоадресной передачи.
Вы можете связать как приемные, так и принимающие сокеты UDP с интерфейсом loopback, если вы хотите, чтобы он использовал только локальную связь с хостом.
0
В конце я использовал связанный сокет домена unix. Владелец хранит массив клиентских FD и отправляет каждое сообщение, когда есть событие.