2014-10-04 71 views
2

目前正在开发一个项目,我必须将相同的数据发送到两个不同的地方:一个是通过IP到服务器,另一个是本地。这个想法是将数据存储在远程服务器上,并在本地机器上实时使用QT绘制数据。是否有可能有两个C++程序访问相同的内存位置

我的数据(来自微控制器)通过串口使用C++客户端接收;客户端将数据发送到C++服务器,但我需要使用QT绘制数据,这是一个独立于C++客户端的不同程序。

我想知道如果两个不同的程序可以访问相同的内存位置只是为了读取数据,如果我有数据的内存地址!

这是我已经有: 1.我的客户端程序能够将数据存储器地址存储到txt文件。 2.现在我正在测试手动硬编码的内存地址,看看我能否得到相同的数据。

问题是我的测试代码不输出任何东西。它没有做任何事就跑来跑去。这里是我的测试代码:

char* ptr_rx = (char *)0x7fffd2848df0; 
cout << ptr_rx << endl; 

,当我试图使用其他程序读取使用的内存地址中的数据我的客户端运行,所以它的地址应该保持不变,只要客户端运行。

请让我知道是否有可能通过两个不同的程序使用内存地址访问相同的内存位置。如果不可能,我会将其取消。

回答

3

您不能简单地使用这样的绝对地址,因为在具有虚拟内存的现代操作系统上,每个进程都有自己的内存映射。您需要使用API​​来共享内存。

如果在Linux或其他UNIX版本中,可以使用共享内存段。低级方法是POSIX API。其他API(Qt,Boost)有最终使用它的包装器。

随着shmget您定义一个唯一的标识符。您将为您的进程使用该键来识别相同的内存段。

第一个调用shmget()的进程会导致分配,并且调用它的后续进程将收到对它的“引用”。两个进程都需要附加到shmat()才能使用指针。这里

很好的例子: http://www.cs.cf.ac.uk/Dave/C/node27.html

对堆栈溢出另一样品:How to use shared memory with Linux in C

显然,这些过程将需要具有的标识符(令牌)来标识唯一的共享内存段。

第一处理将分配存储器,第二将附加(shmget的将返回一个新的段,或现有段):

int key = 12345; 
int shmid; 

if ((shmid = shmget (key, 4096, IPC_CREAT)) == -1) { 
    perror("shmget: "); 
    exit(1); 
} 

cerr << "Shared segment allocated shmid " << shmid << endl; 

// attach 
char *shmbuf = shmat(shmid, NULL); 
+0

非常感谢!我会检查出 – 2014-10-04 03:32:18

2

如果两个程序在同一台机器上运行,是的,你可以让它们共享内存。您可以使用共享内存或内存映射相同的文件来完成此操作。 (这些可能是同一件事;我没有足够的经验来知道它们是不同的东西。)在POSIX系统上,您可能需要查看mmap和可能的shm_open。在Windows上,MSDN有a decent overview of the functions available for use

+0

好消息!你能再详细一点吗?我正在使用uclipse编码C++和eclipse。我不知道什么shm_open和朋友或mmap和朋友。你能评论我做这件事的方式吗?我硬编码我的内存地址,但它没有输出任何东西。 – 2014-10-04 03:22:26

+0

@鸿盘:我没有太多的经验,所以不幸的是,不,我不能。 – icktoofay 2014-10-04 03:23:23

+0

感谢您的想法,我会查找它。 – 2014-10-04 03:25:13

1

看一看QSharedMemory。它提供了一个简单的API来处理共享内存。

2

您可以使用Qt使用共享内存的方式。 Qt提供了QSharedMemory类,您可以在其中通过多个线程和进程使用字符串类型的键访问共享内存段:

QSharedMemory sharedMemory; 
sharedMemory.setKey("MyKey"); 

if(!sharedMemory.create(sizeOfSharedData)) 
{ 
    qDebug() << "Failed to Allocate Shared Memory of size: " << sizeOfSharedData; 
} 
sharedMemory.attach(); 


... 

sharedMemory.detach(); 
+0

我一直在寻找来自boost的SharedMemory。我认为这与QSharedMemory一样。我的问题是,我不明白第二个程序如何知道第一个程序创建的共享内存区域在哪里。假设第一个程序创建共享内存块,我如何让第二个程序找到碎片内存块的位置?或者我如何将某种“地址”传递给第二个程序。我找不到一个很好的例子。 – 2014-10-04 04:28:40

+0

如果您在两个应用程序中使用相同的密钥,则都访问相同的区域。 – Nejat 2014-10-04 04:32:01