目前正在开展一个项目,我必须将相同的数据发送到两个不同的地方:一个是通过IP到服务器,另一个是本地的。我们的想法是将数据存储在远程服务器上,并使用QT在本地计算机上实时绘制数据。
我的数据(来自微控制器)是通过串口使用c ++客户端接收的;客户端将数据发送到c ++服务器,但我需要使用QT绘制数据,QT是一个独立于c ++客户端的不同程序。
我想知道如果我有数据的内存地址,两个不同的程序是否可以访问同一个内存位置只是为了读取数据!
这是我已经拥有的: 1.我的客户端程序能够将数据存储器地址存储到txt文件中。 2.现在我正在测试手动硬编码内存地址以查看是否可以获得相同的数据。
问题是我的测试代码没有输出任何内容。它没有做任何事情就跑了。这是我的测试代码:
char* ptr_rx = (char *)0x7fffd2848df0;
cout << ptr_rx << endl;
当我尝试使用其他程序使用内存地址读取数据时,我的客户端正在运行,因此只要客户端正在运行,其地址应保持不变。
如果甚至可以通过两个不同的程序使用内存地址访问相同的内存位置,请告诉我。如果不可能,我会将其取消。
答案 0 :(得分:4)
你不能简单地使用这样的绝对地址,因为在具有虚拟内存的现代操作系统中,每个进程都有自己的内存映射。您需要使用API来共享内存。
如果在Linux或其他UNIX风格上,您可以使用共享内存段。低级方法是POSIX API。其他API(Qt,Boost)有最终使用它的包装器。
使用shmget
定义唯一标识符。您将使用该密钥为您的进程识别相同的内存段。
调用shmget()
的第一个进程会导致分配,而调用它的后续进程将收到一个“引用”。两个进程都需要使用shmat()
附加到它,以便使用指针。
这里的好例子: http://www.cs.cf.ac.uk/Dave/C/node27.html
Stack Overflow上的另一个示例: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);
答案 1 :(得分:2)
如果这两个程序在同一台机器上运行,是的,你可以让它们共享内存。您可以使用共享内存或内存映射相同的文件来执行此操作。 (这些可能是相同的;我没有足够的经验来了解它们是否是不同的东西。)在POSIX系统上,您可能想要查看mmap
和shm_open
。在Windows上,MSDN有a decent overview of the functions available for use。
答案 2 :(得分:2)
您可以使用Qt方式使用共享内存。 Qt提供了QSharedMemory类,您可以使用类型为string的键通过多个线程和进程访问共享内存段:
QSharedMemory sharedMemory;
sharedMemory.setKey("MyKey");
if(!sharedMemory.create(sizeOfSharedData))
{
qDebug() << "Failed to Allocate Shared Memory of size: " << sizeOfSharedData;
}
sharedMemory.attach();
...
sharedMemory.detach();
答案 3 :(得分:1)
看看QSharedMemory。它提供了一个简单的API来处理共享内存。