gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:09:55 27 4
gpt4 key购买 nike

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

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

int DoStuff() { return 1; }

还有一个指针类型定义:

typedef int(DoStuff_f*)();

还有一个 getter 函数,比如:

DoStuff_f * getDoStuff() { return DoStuff; }

还有一种通过...与进程 B 通信的神奇方式...比如 boost::interprocess

是否可以将函数指针传递给进程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 的数据结构和全局内存!所以简短的回答是,不,这不是您想要的方式!

还有安全措施,例如 address space layout randomization可以阻止这些“技巧”发挥作用。

您混淆了 IPC 和 RPC。 IPC 用于通信数据,例如您的对象或文本 block 。 RPC用于使代码在远程进程中执行。

关于c++ - 是否可以跨进程使用函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1561620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com