C ++ несколько процессов? - PullRequest
4 голосов
/ 05 августа 2009

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 05 августа 2009

Взгляните на Boost.Interprocess

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

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

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

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

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

  • Visual 7.1 Windows XP
  • Visual 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
7 голосов
/ 05 августа 2009

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

2 голосов
/ 07 августа 2009

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

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

1 голос
/ 05 августа 2009

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

...