在两个独立的程序之间传递信息

Posted

技术标签:

【中文标题】在两个独立的程序之间传递信息【英文标题】:Passing information between two seperate programs 【发布时间】:2009-12-17 10:08:41 【问题描述】:

我想在我的程序中传递一个输入变量的值让我们说#1 到另一个程序#2,我希望#2 打印它到屏幕上的数据,两者都需要用 C++ 编写。这将在 Linux 上。

【问题讨论】:

这就是 IPC(进程间通信)的用途 :) @cadthecoder 对于此类问题,您应该始终提及您所在的平台。从你的一个 cmets 中,我看到你提到了 Linux,所以我已经相应地标记了这个 - 将来,请自己做。 我是新来的,但我会记住这一点。 【参考方案1】:

根据平台的不同,有许多可用选项。您尝试执行的操作通常称为进程间通信 (IPC)。

一些选项包括:

套接字 管道 队列 共享内存

最简单的方法可能取决于您使用的平台。

【讨论】:

此操作将在 GNU/Linux 发行版上进行。哪种方式效率更高。 最有效的方式最有可能是共享内存。我会遵循@Space_C0wb0y 的建议并使用更高级别的库,例如 Boost。这将为您简化问题。 效率不太可能那么重要,尽管新手认为它很重要。共享内存可能很难使用,我个人会选择基于套接字的解决方案。使用库(boost 或其他方式)当然是个好主意。 Named Pipes 不是我要找的东西,但 boost 没问题,我会浏览它的文档。 @cadthecoder:命名管道似乎是最好的解决方案:它们相当高效、易于使用、开销低且非常便携 (POSIX)。为什么要添加像 Boost 这样的模板库附带的额外膨胀?完全没有必要解决手头的问题。命名管道将是 Linux(或任何 Unix 变体,真的)上的规范解决方案,恕我直言。【参考方案2】:

与往常一样,有一个Boost library (上帝,我喜欢 Boost)。

【讨论】:

【参考方案3】:

Nic 已经涵盖了我想提到的所有 4 个(在同一台机器上):

套接字 管道 队列 共享内存

如果编写系统调用对您来说很麻烦,您可能需要使用以下库:

    升压http://www.boost.org/ 波科http://pocoproject.org/blog/ 诺基亚 Qt http://qt.nokia.com/

你可以从Qt portable IPC: only QSharedMemory?读到一些东西

【讨论】:

【参考方案4】:

如果效率不是主要问题,则使用普通文件 i/o

否则请 IPC 这样做。

Windows 而言,您有以下选择:

剪贴板, 通讯, 数据复制, , 文件映射, 邮槽, 管道, 反相, Windows 套接字

对于Linux,可以使用Name Pipes(高效)或sockets

【讨论】:

【参考方案5】:

如果您使用的是 Windows,则可以使用 Microsoft 消息队列。这是前面提到的队列示例。

【讨论】:

【参考方案6】:

如果要传递的数据只是一个变量,那么其中一个选项是通过程序 #1 将其设置为环境变量 [ Var1 ] 并在程序 #2 中访问它 [ 如果两者都在相同的 env/ 上运行机器 ]。猜猜这将是最简单的,而不是通过使用 IPC/socket 等使其变得复杂。

【讨论】:

这很容易,但只有在设置变量的程序创建读取它的进程时才会起作用。 是的,尼尔。你说的对。我收回我的陈述。对此感到抱歉。但我想,我们可以从 prog1 启动 prog2,在这种情况下,如果两者都不需要并行运行。如有错误请指正。 好吧,可以从 p#1 开始 p#2,这个环境变量将如何工作。 以下代码 sn-p 可能会对您有所帮助:#include #include using namespace std; int main() putenv("T1=R");系统(“检查环境”); checkenv.cc ----------- #include #include using namespace std; int main() cout 【参考方案7】:

我认为大多数答案都解决了常见的 IPC 机制。我只想补充一点,我可能会选择套接字,因为它在多个平台上是相当标准的。当我需要在 Symbian Series 60 和 Windows Mobile 上实现 IPC 时,我决定这样做。

该范例很简单,除了一些平台故障外,该模型在两个平台上的工作方式相同。我还建议使用协议缓冲区来格式化您发送的数据。谷歌在其基础设施中大量使用了这一点。 http://code.google.com/p/protobuf/

【讨论】:

【参考方案8】: DBUS QtDbus DBus-mm

【讨论】:

【参考方案9】:

针对您对 Roopesh Majeti 的回答的评论,这里有一个使用环境变量的非常简单的示例:

第一个程序:

// 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 字符串

【讨论】:

这对我来说是完美的。谢谢大家的帮助。 请记住,环境变量将暗示进程之间的父/子关系。在这种情况下,管道标准输入/输出也是另一种简单的解决方案,也是共享数据的标准 unix 方式。

以上是关于在两个独立的程序之间传递信息的主要内容,如果未能解决你的问题,请参考以下文章

web中间件是什么

什么是中间件

Flutter:如何在两个小部件之间传递相同的数据?

两个独立应用程序之间的通信

2个应用程序之间的进程间通信

Python多进程运行——Multiprocessing基础教程2