将函数指针保存在共享内存中

Posted

技术标签:

【中文标题】将函数指针保存在共享内存中【英文标题】:Save function pointer in shared memory 【发布时间】:2017-12-27 11:14:32 【问题描述】:

我知道数据可以被多个使用共享内存的应用程序保存和使用。我想知道是否可以?我的目的是从我的共享对象回调到不同应用的返回值和参数相同的函数。

【问题讨论】:

Pointers inside shared memory segment的可能重复 Is it possible to use function pointers across processes?的可能重复 @Aravind 询问数据,而不是函数指针。 @Marc 我没有跨应用程序使用函数指针,而是在应用程序和共享对象之间使用 您需要提供更多信息。 “共享内存”和“共享对象”是两个完全不同的东西。 【参考方案1】:

没有。

除非您以某种方式将代码加载到共享内存区域,或者以其他方式导致代码在两个进程中加载​​到相同的地址,否则函数指针将无效。

【讨论】:

我可以访问所有应用程序的共享对象。但是每个应用程序都获得了我的 .so 库的不同实例 确切地说 - ld.so 不保证程序/库将在进程中加载​​的位置。我认为你应该重新考虑你的设计。 我肯定会考虑您的建议。我需要将 ex.so 中的数据广播/多播到 app1、app2 和 app3。您能否提出更好的方法来实现这一目标? @Black 您是否正在寻找等效的 Windows RWS(读写共享)段? Linux 上没有等效项,您需要手动使用它。在 Windows 和 Linux 中,这将不允许将指针存储在共享段中。 是同一个应用程序吗?如果一个进程派生多个子进程,它们的代码都将加载到相同的地址。在这种情况下,不需要“共享内存”(shm_get)——你可以只 mmap(MAP_SHARED) 一个匿名区域并在所有子进程之间使用它。【参考方案2】:

除非您完全确定自己在做什么,否则将函数指针保存在共享内存段中对我来说是个坏主意,您最终可能会访问您的进程没有权限的函数指针,并且可能会结束让你的程序崩溃。

【讨论】:

【参考方案3】:

不保证共享库会为两个不同的应用程序加载到相同的地址。更糟糕的是,由于地址空间布局随机化,库可以加载到任何随机地址。因此,函数指针不是一成不变的,因此不能存储在任何地方。

作为解决方案,您可以创建一个函数表,其中包含两个进程中所有可能的回调,并将偏移量存储到共享内存中的函数。当然,这些表应该完全相同相同。

【讨论】:

【参考方案4】:

不,不能共享函数指针,如果你愿意,你需要制作那个函数的库并在你的进程中使用它

【讨论】:

以上是关于将函数指针保存在共享内存中的主要内容,如果未能解决你的问题,请参考以下文章

指向 C++ 类的 C 结构指针

嵌入式Linux C语言——指针与函数

函数指针与回调函数

❥关于C++之函数与指针

内存、指针和指向指针的指针

在函数中创建值,然后将指针保存在全局指针数组中的值上