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

时间:2011-08-16 04:12:45

标签: c++ linux shared-memory

任何人都可以看一下这个并建议我使用API​​。

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

3 个答案:

答案 0 :(得分:1)

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

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

您需要一种方法让两个进程使用相同的IPC密钥,这通常通过使用ftok来完成,shmget使用文件规范和标识符为您提供在{{1}中使用的IPC密钥} call(以及其他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 :(得分:0)

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

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

  1. A通过其他一些IPC(比如socket)连接到B
  2. A告知B它应附上细节(名称等)
  3. B然后附加 - 现在B意识到它并且可以开始用它来做事。 (例如,一旦附件完成,B确认到A,然后他们就可以开始通过共享内存块进行通话了。)
  4. 至于在一个漂亮的库中包装共享内存 - 考虑boost :: interprocess。

答案 2 :(得分:0)

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

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