Запускайте одно приложение C ++ из другого и общайтесь с ним - PullRequest
1 голос
/ 05 января 2012

У меня есть программа на C ++ (технически MATLAB mex), которую я планирую использовать для запуска автономной чистой подчиненной программы на C ++ в моей системе.Основная вызывающая программа может выглядеть примерно так:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){
    system ("path/to/slave/program");
}

После запуска ведомого устройства я хотел бы иметь вторую программу mex, которая будет связываться с подчиненной программой и отправлять данные.Отправленные данные будут представлены в виде массивов C ++ большого размера.

Я полагаю, что мне понадобится некоторый дескриптор подчиненной программы (возможно, ее pid?), Метод для отправки сообщений и предположительноспособ для подчиненной программы прослушивать входящие сообщения.

У меня нет опыта в том, чтобы заставить отдельные программы на С ++ взаимодействовать друг с другом, поэтому любые советы в этой области приветствуются.Кроме того, если есть какие-то особые меатабельные предостережения MATLAB, мне было бы интересно узнать об этом.Ubuntu, но в конечном итоге он будет работать на всех платформах.Советы по платформам очень приветствуются, но многоплатформенные идеи - это то, что мне нужно.

Ответы [ 5 ]

8 голосов
/ 05 января 2012

Вы ищете механизм IPC (межпроцессное взаимодействие) .

У Boost есть целая глава по этому вопросу и это кроссплатформенное решение.

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
2 голосов
/ 05 января 2012

Если у вас есть время, как предлагалось в предыдущих ответах, вам обязательно следует пойти на IPC.

Однако есть также много «быстрых и грязных» решений, в которых вам не нужно тратить время на чтение какой-либо документации.

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

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

Если у вас большие аргументы, и вы бы напрасно тратили их на запись на жесткий диск. Я предлагаю вам кое-что еще более грязное: монтирование оперативной памяти и запись на нее:

mkdir -p /tmp/ram
sudo mount -t tmpfs -o size=512M tmpfs /tmp/ram/
1 голос
/ 05 января 2012

Если вы ищете кроссплатформенное решение для проверки связи boost :: interprocess . Документация также содержит довольно мало информации о том, как эти вещи работают.

1 голос
/ 05 января 2012

Я настоятельно рекомендую технологию COM для всех соединений Windows.
http://www.microsoft.com/com/default.mspx

Кстати, если вы хотите использовать код Matlab напрямую, вы можете скомпилировать компонент COM с помощью Matlab Builder NE, так что вывообще не нужно писать mex.

0 голосов
/ 05 января 2012

Это зависит от платформы, но на платформе POSIX вы можете использовать popen(3) для запуска команды, давая вам канал, который вы можете использовать для записи данных на свой стандартный ввод (а также для чтения из его стандартный вывод).

Более переносимая, но менее простая библиотека Boost.Interprocess имеет всевозможные способы взаимодействия между процессами.

...