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

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

【问题讨论】:

标签: c linux


【解决方案1】:

没有。

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

【讨论】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-13
        • 2012-06-02
        • 1970-01-01
        • 2022-07-10
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        相关资源
        最近更新 更多