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