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 через сокеты?

2 ответа

Решение

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

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

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

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

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 в соответствии с целевой платформой компиляции. Пример кода можно взять здесь

Другие вопросы по тегам