Приветствую.
До сих пор периодически возникает бугуртящий вопрос «ну почему D-BUS»?
Попробовал реализовать IPC через shared memory.
Итак, есть один относительно большой файл (мегабайт, или даже два, в зависимости от количества программ, его использующих).
Файл доступен через вызовы ФС, и расположен в условно говоря /dev/shm/file.
Файл в формате JSON.
Когда программе нужно передать какие-то данные другим программам - она сначала читает этот файл в строку, конвертирует в свой блок переменных, добавляет новую переменную в этот блок, конвертирует обратно в JSON и записывает в файл.
Думаю о механизме блокировок говорить не нужно, программа не начнет обрабатывать чтение\запись до тех пор пока висит блокировка (или по тайм-ауту), а когда начнет обрабатывать - добавит уже свою блокировку, чтоб другие программы не писали.
Когда программе нужно прочитать данные - она просто читает этот файл, и достает оттуда интересующую ее переменную.
Соответственно, программа которой нужно прочитать данные - не будет дергать файл постоянно, а только по мере его изменения, а этот флаг можно узнать как периодически дергая дату модификации, так и при помощи ядерного inotify.
Для разграничения владельца, само собой формат переменных может представлять собой ассоциативный массив, где первый ключ - уникальное имя приложения. Шина, если по-dbus-ному.
Pro системы:
Абсолютная универсальность
Любой ЯП любой степени древности имеет базовые функции работы с файловой системой, а для обыкновенной работы с этим видом IPC нужны всего лишь функция чтения, функция записи, и функция проверки существования файла.
JSON-формат прост, знаком всем, с *char работает любой ЯП, привести со своего нативного *char к своему же нужному типу - однозначно проще, чем с этих сраных variant, ss, a(sss) и прочего зоопарка велосипедов. Не говоря уже о том, что функции для парсинга JSON есть в любом современном и не очень ЯП.
Отсутствие посредника
Он попросту не нужен, посредник - сама ФС, которая уже и так есть. Кому нужно - пишет, кому нужно - читают, кому нужно - мониторят.
Соответственно небольшие накладные расходы, а значит производительность. Как ни крути, а записать в память\прочитать с памяти - намного быстрее, нежели дергать демон.
Гибкость
Вся модернизация, если такова необходима, делается силами самой программы, и того кому эта программа нужна.
Данные не исчезают после закрытия программы, хотя запросто могут быть удалены вспомогательными сервисами, если в этом возникнет необходимость.
Понятная простота
Никаких интроспекций, демонов, методов, сигналов и прочего мусора. Максимально приближенная к нативному программированию система: просто используем переменные другой программы, как свои собственные, и позволяем другой программе использовать наши переменные.
- - -
Речь идет исключительно об организации взаимодействия. Стандарты, названия, пути - это уже другая история.
Все пока работает.
Посмотрите пожалуйста со стороны, и покритикуйте способ.
Благодарю.












