Передача информации между двумя отдельными программами - PullRequest
1 голос
/ 17 декабря 2009

Я хочу передать значение входной переменной в моей программе, скажем, # 1, другой программе # 2, и я хочу, чтобы # 2 распечатал данные, которые он получил, на экран, оба должны быть написаны на c ++. Это будет в Linux.

Ответы [ 9 ]

7 голосов
/ 17 декабря 2009

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

Некоторые опции включают в себя:

  • Головки
  • Труба
  • Очередь
  • Общая память

Что проще всего, вероятно, зависит от используемой вами платформы.

6 голосов
/ 17 декабря 2009

Как всегда, для этого есть библиотека Boost (Боже, мне нравится Boost).

4 голосов
/ 17 декабря 2009

Ник охватил все 4, которые я хотел упомянуть (на той же машине):

  • Головки
  • Трубы * * 1006
  • Очередь
  • Общая память

Если вам сложно писать системные вызовы, вы можете использовать следующие библиотеки:

  1. Повышение http://www.boost.org/
  2. Поко http://pocoproject.org/blog/
  3. Nokia Qt http://qt.nokia.com/

Что-то, что вы можете прочитать с Qt portable IPC: только QSharedMemory?

2 голосов
/ 17 декабря 2009

Если эффективность не является главной задачей, тогда используйте нормальный файл ввода / вывода .

В противном случае IPC сделает это.

Что касается Windows , у вас есть следующие опции:

буфер обмена, COM, Копирование данных, DDE, Отображение файлов, Почтовые ящики, Трубы, RPC, Windows Sockets

Для Linux , можно использовать Name Pipes (эффективное) или сокеты .

1 голос
/ 17 декабря 2009
  • DBUS
  • QtDBus
  • DBus мм
1 голос
/ 17 декабря 2009

Я думаю, что большинство ответов касаются общих механизмов МПК. Я просто хотел бы добавить, что я бы, вероятно, пошел на сокеты, потому что это довольно стандартно для нескольких платформ. Я решил пойти на это, когда мне нужно было внедрить IPC, работающий как на Symbian Series 60, так и на Windows Mobile.

Парадигма проста и, за исключением нескольких глюков платформ, модель работала одинаково для обеих платформ. Я бы также предложил использовать буфер протокола для форматирования данных, которые вы отправляете. Google много использует это в своей инфраструктуре. http://code.google.com/p/protobuf/

1 голос
/ 17 декабря 2009

Если передаваемые данные являются просто переменной, то один из вариантов - установить ее как переменную среды [Var1] в программе # 1 и получить к ней доступ, в программе # 2 [если оба работают в одной и той же среде env / машина]. Думаю, это будет самый простой способ, вместо того, чтобы делать его сложным, используя IPC / сокет и т. Д.

1 голос
/ 17 декабря 2009

Если вы работаете в Windows, вы можете использовать Microsoft Message Queuing. Это пример очереди, упомянутой ранее.

0 голосов
/ 17 декабря 2009

В ответ на ваш комментарий к ответу Рупеша Маджети приведем очень простой пример использования переменных среды:

Первая программа:

// p1.cpp - set the variable
#include <cstdlib>
using namespace std;;    
int main() {
    _putenv( "MYVAR=foobar" );
    system( "p2.exe" );
}

Вторая программа:

// p2.cpp - read the variable
#include <cstdlib>
#include <iostream>
using namespace std;;

int main() {
    char * p = getenv( "MYVAR" );
    if ( p == 0 ) {
        cout << "Not set" << endl;
    }
    else {
        cout << "Value: " << p << endl;
    }
}

Примечание:

  • стандартного способа задания переменной среды не существует
  • вам нужно будет создать строку name = value из содержимого переменной
...