Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有可能有两个c++;程序访问同一内存位置_C++_C_Qt_Pointers_Memory - Fatal编程技术网

C++ 有可能有两个c++;程序访问同一内存位置

C++ 有可能有两个c++;程序访问同一内存位置,c++,c,qt,pointers,memory,C++,C,Qt,Pointers,Memory,目前正在进行一个项目,我必须将相同的数据发送到两个不同的地方:一个是通过IP发送到服务器,另一个是本地。其想法是将数据存储在远程服务器上,并使用QT在本地机器上实时绘制数据 我的数据(来自微控制器)是通过串口通过C++客户端接收的;客户端将数据发送到C++服务器,但我需要使用QT来绘制数据,QT是独立于C++客户端的不同程序。p> 如果我有数据的内存地址,我想知道两个不同的程序是否可以访问相同的内存位置来读取数据 以下是我已经拥有的: 1.我的客户端程序能够将数据存储地址存储到txt文件中。 2

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

我的数据(来自微控制器)是通过串口通过C++客户端接收的;客户端将数据发送到C++服务器,但我需要使用QT来绘制数据,QT是独立于C++客户端的不同程序。p> 如果我有数据的内存地址,我想知道两个不同的程序是否可以访问相同的内存位置来读取数据

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

问题是我的测试代码没有输出任何东西。它跑了又停,什么也没做。以下是我的测试代码:

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

cout如果两个程序在同一台机器上运行,是的,您可以让它们共享内存。您可以使用共享内存或同一文件的内存映射来实现这一点。(这些可能是同一件事;我没有足够的经验来了解它们是否是不同的东西。)在POSIX系统上,您可能需要查看
mmap
,也可能是
shm_open
。在Windows上,MSDN有。

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

如果在Linux或其他UNIX版本上,则可以使用共享内存段。低级方法是POSIXAPI。其他API(Qt、Boost)都有最终使用此功能的包装器

使用
shmget
定义唯一标识符。您将在进程中使用该键来标识相同的内存段

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

这里有很好的例子:

堆栈溢出的另一个示例:

显然,进程将需要一个标识符(令牌)来标识唯一的共享内存段

第一个进程将分配内存,第二个进程将连接(shmget将返回新段或现有段):

int key=12345;
int shmid;
如果((shmid=shmget(键,4096,IPC_CREAT))=-1){
佩罗尔(“shmget:”);
出口(1);
}

cerr看一看。它提供了一个使用共享内存的简单API。

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

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

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


...

sharedMemory.detach();
QSharedMemory sharedMemory;
setKey(“MyKey”);
如果(!sharedMemory.create(sizeOfSharedData))
{

qDebug()好消息!你能再详细说明吗?我用Ubuntu编码C++和Eclipse。我不知道什么是SmithOpt和朋友或者MMAP和朋友。你能评论我做的方式吗?我硬编码了我的内存地址,但是它没有输出任何东西。@洪潘:我没有太多的经验,所以很不幸,不,我不能。我一直在看boost的SharedMemory。我想这和QSharedMemory的想法是一样的。我的问题是,我不明白第二个程序如何知道第一个程序创建的共享内存区域在哪里。假设第一个程序创建共享内存块,我如何让我的第二个程序找到碎片备忘录在哪里ry块是?或者我如何将某种“地址”传递给第二个程序。我找不到这样做的好例子。如果在两个应用程序中使用相同的密钥,则两个应用程序都访问相同的区域。
QSharedMemory sharedMemory;
sharedMemory.setKey("MyKey");

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


...

sharedMemory.detach();