Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Взгляни на Boost.Интерпроцесс

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

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

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

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

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

  • Визуальная 7.1 Windows XP
  • Визуал 8.0 Windows XP
  • GCC 4.1.1 МинГВ
  • GCC 3.4.4 Cygwin
  • Интел 9.1 Windows XP
  • GCC 4.1.2 Linux
  • GCC 3.4.3 Солярис 11
  • GCC 4.0 MacOS 10.4.1

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top