IPC через два разных исполняемых файла?

У меня следующая проблема, и я понимаю, что мне нужно использовать IPC через общую память или сетевые сокеты.

У меня есть один исполняемый файл (имеется в виду отдельный .exe), скомпилированный с VS2010, который получает данные откуда-то, и он должен сделать эти данные доступными для второго исполняемого файла.

boost::interprocess::managed_shared_memory managed_shm(
boost::interprocess::open_or_create,
"MyMemBlock",
4000000);

Второй исполняемый файл скомпилирован с VS2012 и должен получить эти данные (или извлечь из памяти) и обработать их.

// fails with a boost::interprocess::interprocess_exception
boost::interprocess::managed_shared_memory managed_shm(
boost::interprocess::open_only,
"MyMemBlock");

Все должно быть как можно быстрее.
Компиляция обоих исполняемых файлов с одной и той же версией Visual Studio не Опция: одна кодовая база компилируется только с VS2010, другая — только с VS2012 / 2013.

Тем не менее, моя первая попытка с boost :: interprocess не сработала (второй процесс создает boost :: interprocess :: interprocess_exception), и я не до конца понимаю, как именно разделяется память, или, точнее, как разделяемая информация о памяти передается от одного процесса к другому. Как первый exe заполняет информацию о блоке общей памяти? Это работает только для нескольких процессов внутри один исполняемый файл? Не несколько .exe? Должна ли это быть одна и та же буст-DLL, используемая обоими исполняемыми файлами? Является ли мой единственный вариант IPC через сокеты?

1

Решение

Вы можете попробовать родной Windows IPC. Там много можно погугли их. рекомендую Отображенные в память файлы. Здесь также хорошая статья от МИЗ

Это, например, сценарий файла непостоянной памяти.

1. Process A creates the memory-mapped file and writes a value to it.

2. Process B opens the memory-mapped file and writes a value to it.

3. Process C opens the memory-mapped file and writes a value to it.

4. Process A reads and displays the values from the memory-mapped file.

5. After Process A is finished with the memory-mapped file, the file is
immediately reclaimed by garbage collection.

Взято из Вот

Boost также есть реализация отображенных в память файлов, он будет использовать собственный низкоуровневый API в соответствии с целевой платформой компиляции. Пример кода можно взять Вот

1

Другие решения

IPC работает в двух разных исполняемых файлах. Два процесса, обращающиеся к разделяемой памяти, не нужно компилировать в один исполняемый файл. Фактически, они могут быть скомпилированы с различными версиями Visual Studio и разными библиотеками Boost. Тем не менее, нужно использовать то же самое версия повышения в обоих исполняемых файлах.

Интересно, что то, что также не работает, запускает один исполняемый файл в release-build, а другой — в debug-build. Я предполагаю, что они распределяют память совершенно другим способом и не могут делиться этим.

1

По вопросам рекламы [email protected]