共享内存 API,其中进程可以将共享内存附加到其他进程

Shared memory API, where a process can attach shared memory to other process

本文关键字:共享 进程 内存 其他 API      更新时间:2023-10-16

任何人都可以研究一下并建议我使用API。

我们有一个进程的API,它可以创建和/或将共享内存附加到它自己的进程。但是我没有找到一个 API 来将共享内存附加到另一个进程的一个进程(例如,进程 A 应该调用一个 API(如 shmat(((将共享内存附加到进程 B(。

共享内存不属于任何特定进程(除非您使用私有IPC_PRIVATE密钥创建它(。它属于系统。

因此,当您将shmget与非私钥(和 IPC_CREAT 标志(一起使用时,您将创建一个共享内存块或附加到现有内存块。

您需要一种方法让两个进程使用相同的 IPC 密钥,这通常是通过使用 ftok 来完成的,它使用文件规范和标识符为您提供用于shmget调用(以及其他 IPC 类型调用,例如 msggetsemget(。

例如,在程序 pax1pax2 中,您可能有一个代码段,如下所示:

int getMyShMem (void) {
    key_t mykey = ftok ("/var/pax.cfg", 0); // only one shm block so use id of 0
    if (mykey == (key_t)-1)                 // no go.
        return -1;
    return shmget (mykey, 1024, IPC_CREAT); // get (or make) a 1K block.
}

通过让两个进程使用相同的文件规范和 ID,它们将获得相同的共享内存块。

您可以使用不同的 ID 为您提供基于同一文件的不同共享内存块(例如,您可能希望一个用于配置共享内存块,另一个用于存储共享状态(。

而且,鉴于它是IPC密钥所基于的配置文件,其他程序使用它的机会很小(我认为它可能为零,但我不是100%确定(。

您不能从进程外部强行将共享内存注入进程(好吧,您可以这样做,但这既危险又需要各种根级权限(。这将破坏受保护的进程模型,并将您的系统变成与MS-DOS一样安全的东西:-(

让我们看看,允许一个进程强制共享内存段到另一个进程?接收器将如何处理它?它怎么知道它现在已经映射了这个块 - 对它的期望。

你以错误的方式思考问题 - 简单地将内存块提升到第二个进程上不会让你做你想做的事。您还需要通知第二个进程,它现在已经映射了此块,因此可以开始使用它进行操作。我建议你退后一步,真正看看你的设计和你在做什么。我推荐的方法是

  1. A 通过其他 IPC(例如套接字(连接到 B。
  2. A 通知 B 它应附上详细信息(姓名等(
  3. 然后 B 附加 - 现在 B 知道它并可以开始用它做事。(例如,一旦连接完成,B 向 A 确认,然后他们可以开始通过共享内存块进行通信(。

至于将共享内存包装在一个漂亮的库中 - 考虑 boost::interprocess。

您要求附加其他进程的进程内存,对吗?

只需open(2)文件/proc/<pid>/mem并使用它即可。检查/proc/<pid>/map以获取文件中可用地址的列表。