我知道每个进程都会创建自己的内存地址空间,但是我想知道,
如果进程 A 具有如下功能:
int DoStuff() { return 1; }
和一个指针 typedef 如:
typedef int(DoStuff_f*)();
和 getter 函数,例如:
DoStuff_f * getDoStuff() { return DoStuff; }
以及一种通过 boost::interprocess 与进程 B 进行通信的神奇方式
是否可以将函数指针传递给进程 B 并调用
进程A的DoStuff直接来自进程B?
不。函数指针只是进程地址空间中的一个地址。它没有不同过程所特有的内在标记。因此,即使您的函数指针在您将其移至 B 后碰巧仍然有效,它也会代表进程 B 调用该函数。
例如,如果您有
////PROCESS A////
int processA_myfun() { return 3; }
// get a pointer to pA_mf and pass it to process B
////PROCESS B////
int processB_myfun() { return 4; } // This happens to be at the same virtual address as pA_myfun
// get address from process A
int x = call_myfun(); // call via the pointer
x == 4; // x is 4, because we called process B's version!
如果进程 A 和 B 运行相同的代码,您最终可能会在相同的地址处获得相同的函数 - 但您仍然会使用 B 的数据结构和全局内存!所以简短的回答是,不,这不是您想要的方式!
此外,还采取了安全措施,例如地址空间布局随机化 http://en.wikipedia.org/wiki/ASLR可能会阻止这些“技巧”发挥作用。
你混淆了 IPC 和 RPC。 IPC 用于通信数据,例如对象或文本块。RPC http://en.wikipedia.org/wiki/Remote_procedure_call用于使代码在远程进程中执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)