目前,在一个项目中,我必须将相同的数据发送到两个不同的地方:一个是通过IP发送到服务器,另一个是本地的。其思想是将数据存储在远程服务器上,并在本地计算机上使用QT实时绘制数据。
我的数据(来自微控制器)是通过串口使用c++客户端接收的;客户端将数据发送到c++服务器,但我需要使用QT绘制数据,QT是一个独立于c++客户端的不同程序。
我想知道如果我有数据的内存地址,两个不同的程序是否可以访问相同的内存位置来读取数据!
下面是我已经拥有的内容: 1.我的客户机程序能够将数据内存地址存储到txt文件中。2.现在我正在测试手动硬编码内存地址,看看是否可以获得相同的数据。
问题是我的测试代码没有输出任何东西。它跑了又停,什么也没做。这是我的测试代码:
char* ptr_rx = (char *)0x7fffd2848df0;
cout << ptr_rx << endl;当我试图使用另一个程序使用内存地址读取数据时,我的客户端正在运行,所以只要客户机正在运行,它的地址就应该保持不变。
请告诉我是否可以使用两个不同程序的内存地址访问相同的内存位置。如果不可能,我会取消的。。
发布于 2014-10-04 03:28:14
您不能简单地使用这样的绝对地址,因为在具有虚拟内存的现代OSes上,每个进程都有自己的内存映射。您需要使用API来共享内存。
如果在Linux或其他UNIX版本上,可以使用共享内存段。低级方法是POSIX API。其他API (Qt,Boost)有最终使用这种包装的包装器。
使用shmget,可以定义唯一的标识符。您将为您的进程使用该键来标识同一内存段。
调用shmget()的第一个进程将导致分配,调用它的后续进程将收到对它的“引用”。为了使用指针,这两个进程都需要通过shmat()附加到它。
这里的好例子是:http://www.cs.cf.ac.uk/Dave/C/node27.html
堆栈溢出的另一个示例:如何在C中与Linux一起使用共享内存
显然,进程将需要一个标识符(令牌)来标识唯一的共享内存段。
第一个进程将分配内存,第二个进程将附加(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);发布于 2014-10-04 03:18:30
如果这两个程序在同一台机器上运行,是的,您可以让它们共享内存。您可以通过共享内存或内存-映射相同的文件来完成此操作。(这可能是一回事;我没有足够的经验去了解它们是否是不同的东西。)在POSIX系统上,您可能需要查看mmap和可能的shm_open。在Windows上,MSDN有对可供使用的功能的适当概述。
发布于 2014-10-04 04:16:56
您可以使用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();https://stackoverflow.com/questions/26189249
复制相似问题