开发者

Passing information between two seperate programs

开发者 https://www.devze.com 2022-12-14 01:59 出处:网络
I want to pass a value of an input variable in my program lets say#1 to another program #2 and开发者_如何转开发 i want #2 to print the data it got to screen, both are needed to be written in c++. The

I want to pass a value of an input variable in my program lets say#1 to another program #2 and开发者_如何转开发 i want #2 to print the data it got to screen, both are needed to be written in c++. The this will be on Linux.


Depending on the platform there are a number of options available. What you are trying to do is typically called inter-process communication (IPC).

Some options include:

  • Sockets
  • Pipes
  • Queues
  • Shared Memory

What is easiest is probably dependent on the platform youa are using.


As always, there is a Boost library for that (God, I like Boost).


Nic has covered all the 4 that I wanted to mention (on the same machine):

  • Sockets
  • Pipes
  • Queues
  • Shared Memory

If writing system calls is troublesome for you, you may want to use the following libraries:

  1. Boost http://www.boost.org/
  2. Poco http://pocoproject.org/blog/
  3. Nokia Qt http://qt.nokia.com/

Something you can read from Qt portable IPC: only QSharedMemory?


If effeciency is not prime concern then use normal file i/o.

else go for IPC to do so.

As far as Windows is concern you have following options :

Clipboard , COM , Data Copy , DDE , File Mapping , Mailslots , Pipes , RPC , Windows Sockets

For Linux , use can use Name Pipes(efficient) or sockets.


If you're on Windows, you can use Microsoft Message Queueing. This is an example of queue mentioned previously.


If the data to be passed is just a variable, then one of the option is to set it as Environment Variable [ Var1 ] by program #1 and access it, in Program #2 [ if both are running on same env/machine ]. Guess this will be the easiest one, instead of making it complex, by using IPC/socket etc.


I think most of the answers have address the common IPC mechanisms. I'd just like to add that I would probably go for sockets because it's fairly most standard across several platforms. I decided to go for that when I needed to implement IPC that worked both on Symbian Series 60 and Windows Mobile.

The paradigm is straightforward and apart from a few platform glitches, the model worked the same for both platforms. I would also suggest using Protocol Buffers to format the data you send through. Google uses this a lot in its infrastructure. http://code.google.com/p/protobuf/


  • DBUS
  • QtDbus
  • DBus-mm


In response to your comment to Roopesh Majeti's answer, here's a very simple example using environment variables:

First program:

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

Second program:

// 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;
    }
}

Note:

  • there is no standard way of setting an environment variable
  • you will need to construct the name=value string from the variable contents
0

精彩评论

暂无评论...
验证码 换一张
取 消