当前位置:  开发笔记 > 编程语言 > 正文

是否可以跨进程使用函数指针?

如何解决《是否可以跨进程使用函数指针?》经验,为你挑选了2个好方法。

我知道每个进程都创建了自己的内存地址空间,不过我想知道,

如果进程A具有如下函数:

int DoStuff() { return 1; }

和指针typedef,如:

typedef int(DoStuff_f*)();

和一个getter函数,如:

DoStuff_f * getDoStuff() { return DoStuff; }

和一个通过...进行通信的神奇方式...说boost :: interprocess

是否可以将函数指针传递给进程B并调用

直接从流程B处理A的DoStuff?



1> Kirill V. Ly..:

简而言之,您不能使用传递给另一个进程的函数指针.

功能代码位于受保护的内存页面中,您无法写入它们.并且每个进程都有隔离的虚拟地址空间,因此功能地址在另一个进程中无效.在Windows中,你可以使用描述的技术这条注入另一个进程中的代码,但Windows的最新版本的拒绝.

您应该考虑创建一个将在两个进程中使用的库,而不是传递函数指针.在这种情况下,您可以在需要调用该函数时将消息发送到另一个进程.



2> Steven Schla..:

不.所有函数指针都是进程地址空间中的地址.它没有内在标记,这是不同过程所特有的.因此,即使您的函数指针恰好在将其移动到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的数据结构和全局内存!所以简短的回答是,不,这不是你想要做到的!

此外,诸如地址空间布局随机化之类的安全措施可以防止这些"诡计"无法正常工作.

你混淆了IPC和RPC.IPC用于传递数据,例如对象或文本块. RPC用于使代码在远程进程中执行.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有