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;
当我尝试使用另一个程序通过内存地址读取数据时,我的客户端正在运行,因此只要客户端正在运行,其地址就应保持不变。
请让我知道,是否有可能通过两个不同的程序使用存储地址访问相同的存储位置。如果不可能的话,我会取消。
您不能简单地使用这样的绝对地址,因为在具有虚拟内存的现代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);