是否可以让两个C ++程序访问同一内存位置

Hon*_*Pan 3 c c++ memory qt pointers

目前在一个项目中,我必须将相同的数据发送到两个不同的地方:一个是通过IP发送到服务器,另一个是本地的。这个想法是将数据存储在远程服务器上,并使用QT在本地计算机上实时绘制数据。

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

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

这是我已经拥有的:1.我的客户端程序能够将数据存储地址存储到txt文件中。2.现在,我正在测试手动对内存地址进行硬编码,以查看是否可以获取相同的数据。

问题是我的测试代码没有输出任何东西。它没有做任何事情就跑了下来,停了下来。这是我的测试代码:

char* ptr_rx = (char *)0x7fffd2848df0;
cout << ptr_rx << endl;
Run Code Online (Sandbox Code Playgroud)

当我尝试使用另一个程序通过内存地址读取数据时,我的客户端正在运行,因此只要客户端正在运行,其地址就应保持不变。

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

cod*_*eim 5

您不能简单地使用这样的绝对地址,因为在具有虚拟内存的现代OS中,每个进程都有自己的内存映射。您需要使用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);
Run Code Online (Sandbox Code Playgroud)