Кроссплатформенный IPC - PullRequest
       46

Кроссплатформенный IPC

68 голосов
/ 13 сентября 2008

Я ищу предложения о возможных механизмах МПК, которые:

  • Кроссплатформенная (Win32 и Linux как минимум)
  • Простота реализации в C ++ , а также наиболее распространенных языках сценариев (perl, ruby, python и т. Д.).
  • Наконец, прост в использовании с точки зрения программирования!

Какие у меня варианты? Я программирую под Linux, но я хотел бы, чтобы то, что я пишу, было переносимым на другие ОС в будущем. Я думал об использовании сокетов, именованных каналов или что-то вроде DBus.

Ответы [ 16 ]

52 голосов
/ 15 сентября 2008

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

Однако трудной частью является не канал связи, а сообщения, которые вы передаете по нему. Вы действительно хотите посмотреть на то, что будет выполнять проверку и анализ для вас. Я рекомендую посмотреть на протокол буфера Google . Вы в основном создаете файл спецификации, который описывает объект, который вы хотите передать между процессами, и есть компилятор, который генерирует код на нескольких разных языках для чтения и записи объектов, соответствующих спецификации. Это гораздо проще (и менее подвержено ошибкам), чем пытаться придумать протокол обмена сообщениями и выполнить синтаксический анализ самостоятельно.

16 голосов
/ 13 сентября 2008

Для C ++, проверьте Повышение IPC .
Вы можете, вероятно, создать или найти некоторые привязки для языков сценариев.

В противном случае, если действительно важно иметь возможность взаимодействовать с языками сценариев, лучше всего использовать файлы, каналы или сокеты или даже абстракцию более высокого уровня, например HTTP.

9 голосов
/ 16 сентября 2008

Почему не D-Bus? Это очень простая система передачи сообщений, которая работает практически на всех платформах и разработана для обеспечения надежности. На данный момент он поддерживается практически всеми языками сценариев.

http://freedesktop.org/wiki/Software/dbus

8 голосов
/ 30 июля 2014

Если вам нужно портативное, простое в использовании, многоязычное и LGPL ed решение, я бы порекомендовал вам ZeroMQ :

  • Удивительно быстро, почти линейно масштабируемо и все же просто.
  • Подходит для простых и сложных систем / архитектур.
  • Доступны очень мощные шаблоны связи: REP-REP, PUSH-PULL, PUB-SUB, PAIR-PAIR.
  • Вы можете настроить транспортный протокол, чтобы сделать его более эффективным, если вы передаете сообщения между потоками (inproc://), процессами (ipc://) или компьютерами ({tcp|pgm|epgm}://), с умной опцией для сокращения некоторой части издержек протокола в случае соединения между виртуальными машинами VMware (vmci://).

Для сериализации я бы предложил MessagePack или протокольные буферы (которые уже упоминались другими), в зависимости от ваших потребностей.

8 голосов
/ 16 сентября 2008

Возможно, вы захотите попробовать YAMI , он очень простой, но функциональный, переносимый и поставляется с привязкой к нескольким языкам

5 голосов
/ 26 января 2010

YAMI - еще одна инфраструктура обмена сообщениями - это облегченная инфраструктура обмена сообщениями и сетей.

5 голосов
/ 13 сентября 2008

Я думаю, вы захотите что-то на основе сокетов.

Если вы хотите RPC, а не просто IPC, я бы предложил что-то вроде XML-RPC / SOAP, которое работает по HTTP и может использоваться на любом языке.

5 голосов
/ 13 сентября 2008

Как насчет Экономия Facebook ?

Thrift - это программная структура для разработки масштабируемых кросс-языковых сервисов. Он объединяет программный стек с механизмом генерации кода для создания сервисов, которые эффективно и без проблем работают между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, Smalltalk и OCaml.

4 голосов
/ 19 июня 2016

Я могу предложить вам использовать библиотеку plibsys C. Это очень простой, легкий и кроссплатформенный. Выпущен под LGPL. Это обеспечивает:

  • именованные общесистемные области общей памяти (реализации System V, POSIX и Windows);
  • именованные общесистемные семафоры для синхронизации доступа (реализации System V, POSIX и Windows);
  • именованная общесистемная реализация общего буфера на основе общей памяти и семафора;
  • сокеты (TCP, UDP, SCTP) с поддержкой IPv4 и IPv6 (реализации UNIX и Windows).

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

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

  • процесс помещает данные в сегмент совместно используемой памяти и отправляет уведомление через сокет другому процессу; поскольку уведомление обычно очень мало, накладные расходы минимальны;
  • другой процесс получает уведомление и считывает данные из сегмента общей памяти; после этого он отправляет уведомление о том, что данные были прочитаны обратно первому процессу, чтобы он мог передавать больше данных.

Этот подход может быть реализован кроссплатформенным способом.

4 голосов
/ 15 сентября 2008

Если вы хотите попробовать что-то немного другое, есть платформа ICE от ZeroC . Он имеет открытый исходный код и поддерживается практически во всех операционных системах, о которых вы только можете подумать, а также поддерживает языки C ++, C #, Java, Ruby, Python и PHP. Наконец, им очень легко управлять (языковые сопоставления специально адаптированы для каждого языка). Это также быстро и эффективно. Есть даже урезанная версия для устройств.

...