Двусторонняя связь отдельных программ. - PullRequest
2 голосов
/ 12 июня 2019

Я пытаюсь установить двустороннюю связь «многие-к-одному» между программами в Linux.

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

Вопрос, который я еще не нашел: как новые программы должны уведомлять драйвер о том, что новая программа запущена, чтобы установить еще одно соединение (именованный канал) между новой программой и драйвером?

Все программы будут написаны на C ++

enter image description here

Ответы [ 2 ]

5 голосов
/ 12 июня 2019

По сути, вы описали отношения сервер / клиент между программами; то, что делает каждая программа по обе стороны коммуникационного моста, вероятно, не имеет значения.

Несмотря на то, что эти процессы вытекают из вопроса о том, что они предназначены для одной и той же машины, сеть все еще доступна для вас через localhost.

Если вы не подключены к каналам, почему бы не использовать порт для драйвера (сервера), известного каждой программе (клиенту), который слушает сервер?

Я полагаю, что это в значительной степени основополагающая философия X-Windows.

Кроме того, должно быть много надежного кода, чтобы начать работу.

3 голосов
/ 12 июня 2019

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

Сервер открывает канал с именем channel_request для чтения.Любой новый клиент открывает его для записи и пишет уникальный идентификатор.(PID должен работать).Сервер читает этот идентификатор и создает именованный канал с именем channel_[id].Затем клиент открывает channel_[id] для чтения и может начать получать данные.

Обратите внимание, что каналы Linux являются однонаправленными, поэтому, если вы хотите двустороннюю связь, как показано на диаграмме, вам нужно будет открыть как channel_[id]_out, так и channel_[id]_in.

...