2009-08-05 3 views
4

У меня есть проект, состоящий из двух процессов, и мне нужно передавать некоторые данные между ними быстрым и эффективным образом.C++ несколько процессов?

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

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

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

Также существует кросс-платформенный способ создания нового процесса?

ответ

7

Для IPC, Windows supports named pipes точно так же, как Linux does, за исключением того, что названия труб следуют в другом формате из-за различий в форматах пути между двумя операционными системами. Это то, что вы могли бы преодолеть с помощью простого препроцессора. Обе операционные системы также поддерживают неблокирующий IO на трубах и мультиплексирование ввода-вывода с помощью select().

1

Это может быть излишний, но вы можете использовать Apache Portable Runtime; here - это функции потока и процесса.

12

Посмотрите на Boost.Interprocess

Boost.Interprocess упрощает использование связи и синхронизации механизмов общего межпроцессного и предлагает широкий выбор из них:

  • Общая память.
  • Файлы с отображением памяти.
  • Семафоры, мьютексы, переменные условий и обновляемые типы мьютексов, чтобы поместить их в разделяемую память и файлы с отображением памяти.
  • Именованные версии этих объектов синхронизации, похожие на UNIX/Windows sem_open/CreateSemaphore API.
  • Блокировка файлов.
  • Относительные указатели.
  • Очереди сообщений.

Boost.Interprocess также предлагает межпроцессный механизмы более высокого уровня динамически выделять участки общей памяти или памяти отображенного файла (в общем случае, для выделения части сегмента памяти фиксированного размера). Используя эти механизмы, Boost.Interprocess предлагает полезные инструменты построить C++ объекты, включая STL-как контейнеры, в общей памяти и памяти преобразованные файлы:

  • Динамическое создание анонимных и именованных объектов в общей памяти или памяти отображается файл ,
  • STL-подобные контейнеры, совместимые с файлами с общей памятью/памятью.
  • STL-подобные распределители, готовые для совместной работы с памятью/памятью, реализующие несколько шаблонов распределения памяти (например, объединение в пул).

Boost.Interprocess был протестирован в следующих компиляторов/платформ:

  • Визуальный 7.1 Windows XP с
  • Визуальный 8.0 Windows XP
  • GCC 4.1.1 MinGW
  • GCC 3.4.4 Cygwin
  • Intel 9.1 Windows XP
  • GCC 4.1.2 Linux
  • GCC 3.4.3 Solaris 11
  • GCC 4.0 MacOs 10.4.1
+2

boost :: interprocess имеет фиктивную реализацию на окнах, которая использует оживленные ожидания для всего. Я бы не рекомендовал это сам. – bdonlan

2

Plain старый TCP должен работать достаточно эффективно; как я понимаю, современные ОС обнаруживают, когда оба конца TCP-соединения расположены на одной машине, и будут внутренне маршрутизировать эти данные через быстрый, легкий (трубчатый) механизм, а не через обычный стек TCP.

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

+0

Какая ОС делает то, что вы сказали? Пожалуйста, поделитесь с нами. – Test

+0

Если Linux, я уверен, это не так, потому что пакеты могут быть захвачены tcpdump, а 2 - на той же машине. – Test

+0

Мое сообщение основано в основном на разговоре с RobSeace на сайте часто задаваемых вопросов Unix Sockets, вы можете прочитать его здесь: http://www.developerweb.net/forum/showthread.php?t=5154 В в частности, эта цитата из Rob: «Да, сокеты домена Unix будут намного эффективнее, минуя много файлов стека TCP/IP ядра, что не обязательно для локального IPC ... (Хотя, если вы используете 127.0.0.1, большинство современные системы также должны немного оптимизировать интерфейс loopback ...) " –

Смежные вопросы