IPC связь между несколькими идентичными процессами - PullRequest
1 голос
/ 23 апреля 2011

Контекст: Linux (Ubuntu), C

У меня есть несколько идентичных минималистических процессов, порожденных в одной коробке.Процессы занимаются определенным сетевым взаимодействием и проводят большую часть своего времени в poll (или select или в любом другом месте - я могу изменить это при необходимости).

Время жизни процессов контролируется runit сmultiwatch (если это что-то меняет).

Время от времени случайный процесс может решить, что он хочет отправить сообщение (т. Е. Набор данных) всем другим процессам (включая себя, еслиэто делает вещи проще).

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

Доставка сообщений должна быть гарантирована.Но он не должен блокировать отправителя, если какие-либо (или все) получатели внезапно исчезли (OTOH, если они живы, но заняты, они должны в конечном итоге получить сообщение.) Если процесс получателя находится в режиме ожидания в опросе, он должен быть разбужен сообщением.

Какой самый надежный способ организовать это общение без особых сложностей?

Примечание. По техническим причинам я не могу использовать сигналы POSIX для связи между процессами.

Ответы [ 2 ]

1 голос
/ 22 марта 2017

Я знаю, что эта ветка довольно старая, думал, что ответ может помочь кому-то там.Я использовал Kbus и обнаружил, что он отлично подходит для трансляции сообщений между несколькими процессами.Это модуль ядра Linux с библиотекой User, которую процессы должны использовать для создания дескрипторов.Использует шаблон проектирования «Публикация / подписка», который делает его несвязной системой.

Источник: https://github.com/kynesim/kbus

Документы: https://kbus.readthedocs.io/en/latest/

Симит

1 голос
/ 23 апреля 2011

Термины «широковещательный» и «надежный» противоречат друг другу, я думаю, вам придется установить все для всех надежных одноадресных соединений и самостоятельно выполнить «широковещательную» передачу.

Я написал несколько программ для кластеризации, в которых узлам локальной сети необходимо найти друг друга и установить надежную связь - схема для этого была следующей:

  • Каждый процесс настроен с тем же номером порта и широковещательным адресом локальной сети
  • Каждый процесс связывает прослушиватель TCP со случайным локальным портом
  • Каждый процесс связывается с указанным локальным портом UDP, прослушивая широковещательные сообщения
  • Каждый процесс отправляет сообщение о своем присутствии, ID (например, PID) и конечной точке TCP каждые несколько секунд
  • Когда процесс обнаруживает другой процесс с более низким идентификатором, он устанавливает TCP-соединение с ним и, при необходимости, запрашивает список известных пиров

После этого каждый процесс подключается к любому другому процессу, и вы можете реализовать «надежную трансляцию» вручную.

...