c++ - c ++将值设置为特定地址
问题描述
我想通过将变量值设置为特定地址来在两个程序之间进行数据交换。数据可以分配到地址中,但是当我在一个程序中更改值时,另一个程序仍然没有得到值
Program1.cpp 将值设置为特定地址,Program2.cpp 从该地址获取数据,两者都包含头文件“DataExchange.h”
程序1.cpp:
#include <iostream>
#include <windows.h>
#include "DataExchange.h"
using namespace std;
int main(int argc, char** argv) {
double val2 = 0;
double spd = 1;
double* ptr2 = (double*)speed_address;
cout << "Program1" << endl;
while(1){
DXSetvalue (Speed, spd);
val2 = DXGetvalue (Speed);
cout << "[speed] = " << spd++ << " [get speed] = " << val2 << " [address] = " << ptr2 << "\r" ;
Sleep(2000); // 2sec
}
return 0;
}
程序2.cpp:
#include <iostream>
#include <windows.h>
#include "DataExchange.h"
using namespace std;
int main(int argc, char** argv) {
double t = 0;
double val = 0;
int* ptr = (int*)speed_address;
cout << "Program1 Node" <<endl;
init();
while(1){
t += 2;
val = DXGetvalue (Speed);
cout << "(" << t << "sec) " <<"[Speed] = " << val << " [blackboard address] = " << ptr << "\r";
Sleep(2000);
}
}
数据交换.h:
#include "stdio.h"
// The macro of the value ID
#define Speed 1
// Define of the address of the value
//#define speed_address 0x4a8048
//#define speed_address 0x00CFFB3C
#define speed_address 0x7ffef8
// Declaration
void setaddressValue (double* address, double d);
double getaddressValue (int name);
double* addressID (int name);
void DXSetvalue (int name, double d);
double DXGetvalue (int name);
void init();
// Definition
void setaddressValue (double* address, double d){
double* p = (double*)address;
*p = d;
//printf("p = 0x%x *p = %lf\n", p, *p);
}
double getaddressValue (int name){
double* pGet = addressID(name);
double value = *pGet;
//printf("pGet = 0x%x *pGet = %lf\n", pGet, *pGet);
return value;
}
double* addressID (int name){
switch (name){
case 1:
return (double*)speed_address;
default:
//cout << "not set the address" << endl;
printf("not set the address!!!\n");
}
}
/*program data*/
void DXSetvalue (int name, double d){
setaddressValue(addressID(name), d);
}
double DXGetvalue (int name){
return getaddressValue (name);
}
void init(){
double* p = (double*)speed_address;
*p = 0.5;
}
解决方案
在内核上运行的程序使用虚拟寻址,这意味着给定程序无法访问另一个程序的地址空间。如果您想促进进程间通信,请考虑使用 Unix 套接字。
推荐阅读
- c# - 如何将 EventHandler 添加到 WebSocketClient
- typescript - 具有定义值的打字稿动态对象键
- php - 检查运行windows服务器的php-fpm
- react-native - 无法从 react-native 中的另一个屏幕获取带有 URL 的参数
- php - Lang 文件上的 Laravel 验证
- sqlite - 将 spatialite 构建到 Qt QSqlDatabase 驱动程序中
- android - SQLite 主键设置错误 - 为什么会这样?
- windows - 使用 EnableDelayedExpansion 在命令行脚本中显示感叹号 (!)
- ios - 如何在 macOS Mojave 10.14.6 上运行 Xcode 11.4
- javascript - Javascript - 脚本在第二次点击时不起作用