【发布时间】:2021-10-22 05:53:17
【问题描述】:
只是一个杂项问题。 我有一个 C++ 程序:
#include <stdio.h>
int main()
{
while (1) {
int value1 = 1;
printf("%p\n", (void *)&value1);
void* address = (void *)&value1;
int value2 = *(int*)address;
printf("%d\n",value2);
}
return 0;
}
它的作用是获取value1的地址,将其存储在address中,然后获取address中的变量并将其存储在value2中。 这很好用,但是,我想从另一个 C++ 程序访问该变量。我试过这个(这个文件中有两种方法):
#include<iostream>
#include <cstdint>
int main() {
std::cout << "before seg fault" << std::flush;
uintptr_t p = <address>;
int value = *reinterpret_cast<int *>(p);
int value2 = *(int*)<address>;
std::cout << "after seg fault"<< std::flush;
std::cout << value;
return 0;
}
这会在尝试访问该值时导致分段错误,这可能是因为操作系统不希望我访问此值,或者因为它在此实例中不存在。
无论这看起来多么不切实际和愚蠢,有没有办法克服这个问题?还是不可能?作为旁注,我为什么应该/为什么不应该这样做?
编辑:我已经批准了 Chris 的回答,因为当您在 linux 上使用 root 运行它时它工作得很好。要求也适用于 Mac 和 Windows 的东西会不会太过分了?我曾尝试在 Mac 系统上运行 poke 程序,但它给出了错误:无法访问 pid 26112:: No such file or directory,由以下行调用:
fprintf(stderr, "usage: %s pid address value\n", av[0]);
【问题讨论】:
-
查找“共享内存”。可以这样做,但它相对复杂,依赖于操作系统,并且需要特别注意避免两个程序访问内存时出现竞争条件。
-
我想从另一个 C++ 程序访问该变量你的操作系统会阻止这种情况并使地址无用,因为地址是虚拟的每个进程都有自己的地址空间。
-
@NateEldredge 在技术上是错误的答案。共享内存不会让一个进程访问其他进程的堆栈或堆。
-
@SergeyA:是的 - 必须使用在共享块中专门分配的对象。但它是最接近的常用机制。
-
根据操作系统、硬件和执行代码的权限级别,这可能是可能的。当然,你不需要这个。
标签: c++ pointers memory segmentation-fault ram