在两个独立的程序之间传递信息
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我认为大多数答案都解决了常见的 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 方式。以上是关于在两个独立的程序之间传递信息的主要内容,如果未能解决你的问题,请参考以下文章