任何人都可以看一下这个并建议我使用API。
我们有一个API,用于创建和/或将共享内存附加到其自己的进程的进程。但是我没有找到一个API来通过其他进程将共享内存附加到一个进程(例如,进程A应该调用一个API(如shmat())来将共享内存附加到进程B)。
答案 0 :(得分:1)
共享内存不属于任何特定进程(除非您使用私有IPC_PRIVATE
密钥创建它)。它属于该系统。
因此,当您将shmget
与非私钥(以及IPC_CREAT
标志)一起使用时,您将创建一个共享内存块或附加到现有内存块。
您需要一种方法让两个进程使用相同的IPC密钥,这通常通过使用ftok
来完成,shmget
使用文件规范和标识符为您提供在{{1}中使用的IPC密钥} call(以及其他IPC类型调用,例如msgget
或semget
)。
例如,在程序pax1
和pax2
中,您可能会有以下代码段:
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)
让我们看一下,允许一个进程强制共享内存段到另一个进程?接收器将采取什么措施?它现在如何知道它已经映射了这个块 - 对它的期望是什么。
你正在以错误的方式思考这个问题 - 只需将一块内存挂到第二个进程就不会让你做你想做的事情。您还需要通知第二个进程它现在已经映射了这个块,因此可以开始使用它。我建议你退后一步,真正看看你的设计和你在做什么。我推荐的方法是
至于在一个漂亮的库中包装共享内存 - 考虑boost :: interprocess。
答案 2 :(得分:0)
您要求附加其他进程的进程内存,对吗?
只需open(2)
文件/proc/<pid>/mem
并使用它。检查/proc/<pid>/map
以获取文件中可用地址的列表。