是否可以在同一台计算机上的两个不同程序之间使用公共指针

时间:2010-02-25 22:35:51

标签: c++ linux pointers ubuntu-9.10

我需要2个不同的程序来处理单个数据集。 我可以在它们之间建立网络(UDP)连接,但我想避免以任何方式传输整个数据。

这听起来有点荒谬,但有可能在这两个程序之间共享某种指针,这样当一个更新它时,另一个可以简单地获取指针并开始使用它吗?

我正在使用Ubuntu 9.10

8 个答案:

答案 0 :(得分:12)

你在谈论IPC - 进程间通信。有很多选择。

一个是内存映射文件。它接近于你所描述的。但是,它可能是也可能不是满足您要求的最佳方法。阅读IPC以获得一些深度。

答案 1 :(得分:9)

您正在寻找的内容通常称为“共享内存段”,您访问它的方式是特定于平台的。

在POSIX(大多数Unix / Linux)系统上,您使用sys / shm.h中的shm _ *()API。

在Win32上,它完成了内存映射文件,所以你将使用CreateFileMapping()/ MapViewOfFile()等。

不确定Mac,但你也可以使用shm _ *()。

答案 2 :(得分:2)

共享内存可以提供任何形式的IPC可用的最高带宽,但是管理也很麻烦 - 您需要同步访问共享内存,就像使用线程一样。如果确实需要原始带宽,那就是最好的 - 但是需要这种带宽的设计往往是在流程之间选择不当的分界线,在这种情况下它可能是不必要地让它运作良好。

另请注意,管道(例如)更容易使用,并且仍然具有相当严重的带宽 - 它们仍然(通常)在内存中使用内核分配的缓冲区,但它们会自动同步对它的访问。带宽的损失是因为自动化同步需要非常悲观的锁定算法。尽管如此,这仍然没有带来巨大的开销......

答案 3 :(得分:1)

POSIX共享Unix风格的内存函数。 IBM大型机(370 / xa / esa / Zos)可以使用低级别的跨内存服务。您还必须考虑您的应用是否会扩展到单个处理器之外。

答案 4 :(得分:1)

也许在你的两个进程之间使用“memcached”作为代理可能会更好,然后每个进程可以在彼此之间交换密钥。

您受到我认为每个键/值对1024Kb或更少的限制,但直接的好处是互操作性,稳定性以及将多台机器上的多个进程连接在一起的未来能力。

答案 5 :(得分:1)

如果你真的,真的需要这样做,这是一个暗示,你的两个程序可能真的被改为一个有两个线程...(如果你有程序源,这是一块蛋糕)。

答案 6 :(得分:0)

不,抱歉。我很久以前就听说过一个具有非常大的地址空间的实验性操作系统,其中部分地址在一台机器上,其他部分在其他机器上。它会让你完全满足你的要求......

注意:我假设2个程序在不同的机器上运行。如果它们只是不同的进程,则可以使用命名的部分来共享数据。

答案 7 :(得分:0)

抛开可以完成的事实,进程间通信永远不会通过共享资源来完成 - 更不用说内存空间了。这是灾难的正确方法。

适当的IPC通过适当的通信方式完成,例如套接字。分享记忆永远不是你想要的。