Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在同一台计算机上的两个不同程序之间可能有一个公共指针吗_C++_Linux_Pointers_Ubuntu 9.10 - Fatal编程技术网

C++ 在同一台计算机上的两个不同程序之间可能有一个公共指针吗

C++ 在同一台计算机上的两个不同程序之间可能有一个公共指针吗,c++,linux,pointers,ubuntu-9.10,C++,Linux,Pointers,Ubuntu 9.10,我需要两个不同的程序来处理一组数据。 我可以在它们之间建立一个网络(UDP)连接,但我想避免通过任何方式传输整个数据 这听起来有点荒谬,但有没有可能在这两个程序之间共享某种指针,以便当一个程序更新它时,另一个程序可以简单地获取指针并开始使用它 我正在使用Ubuntu 9.10,对不起。我很久以前听说过一个实验性的操作系统,它有一个非常大的地址空间,其中一部分在一台机器上,另一部分在其他机器上。它会完全允许你所要求的 注意:我假设这两个程序在不同的机器上运行。如果它们只是不同的进程,您可以使用命名

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

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


我正在使用Ubuntu 9.10,对不起。我很久以前听说过一个实验性的操作系统,它有一个非常大的地址空间,其中一部分在一台机器上,另一部分在其他机器上。它会完全允许你所要求的


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

您指的是IPC-进程间通信。有很多选择


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

用于Unix风格的POSIX共享内存函数。IBM大型机(370/xa/esa/Zos)可以在较低级别上使用跨内存服务。你也必须考虑你的应用程序是否会超过单个处理器。

你所寻找的通常被称为“共享内存段”,你如何访问它是特定于平台的。 在POSIX(大多数Unix/Linux)系统上,使用sys/shm.h中的shm_*()API

在Win32上,它是通过内存映射文件完成的,因此您将使用CreateFileMapping()/MapViewOfFile()等


不太清楚Mac,但您可能也可以在那里使用shm*()。

抛开可以实现的事实不谈,进程间通信从来都不是通过共享资源来实现的,更不用说内存空间了。这是造成灾难的正确方法


正确的IPC是通过适当的通信方式完成的,如插座。共享内存从来都不是解决问题的办法。

共享内存可以提供任何可用IPC形式中的最高带宽,但管理起来也有点困难——您需要同步访问共享内存,就像使用线程一样。如果你真的需要原始带宽,这是最好的——但是一个需要这种带宽的设计通常是在进程之间选择了一条很差的分界线,在这种情况下,让它正常工作可能是不必要的困难

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

也许在两个进程之间使用“memcached”作为代理会更好,那么每个进程都可以在彼此之间交换密钥


我相信每个密钥/值对的容量为1024Kb或更少,但最直接的好处是互操作性、稳定性和将来将多台计算机上的多个进程连接在一起的能力。

如果您真的需要这样做,这暗示着您的两个程序可能真的被更改为一个具有两个线程的程序。。。(如果您有程序源,那么这是小菜一碟)。

这是可能的,但解决方案是特定于操作系统的,您希望它用于什么操作系统?任何特定平台?许多系统可以支持内存映射文件。简短回答:共享内存。稍长一点:如果您已经在序列化,考虑本地套接字或管道:类似的语义,没有IP /(假)网络开销。在UNIX上,同一台机器上的任何网络通信都可以绕过网络层,并且直接在内核中完成。它可能足够快,以至于你不会注意到(或无法测量)@Martin:即使在localhost短路的情况下,仍然会涉及到复制操作。共享内存可以避免这种情况。下面的链接可能会有所帮助。它使用Boost库。IPC通常并不容易。进程终止时,操作系统会清理文件(包括内存映射文件)和套接字等内容。共享内存通常不会。因此,您通常不知道给定的共享内存块是否正在使用,您的程序必须以某种方式确定是否需要创建所需的共享内存块。Niklaos:幸好我们是程序员,而不是用户;)虽然Mach端口是首选方式,但shm_*在Mac上也能正常工作。为什么从来没有?这取决于应用程序,甚至apache Web服务器也使用共享内存“记分牌”在其进程之间进行通信。一般来说,最好尽量避免两个程序/线程写入同一内存(尽管有时这确实是最好的方式)。但是,如果其中一个进程/线程只读取内存,这在很大程度上是正常的,所有适用于使用共享内存的注意事项。IPC机制的性能因操作系统而异。不保证任何共享设备的性能。在某些系统上,共享内存甚至比其他方法慢,比如像您建议的那样使用管道。