共享内存 API,其中进程可以将共享内存附加到其他进程
Shared memory API, where a process can attach shared memory to other process
任何人都可以研究一下并建议我使用API。
我们有一个进程的API,它可以创建和/或将共享内存附加到它自己的进程。但是我没有找到一个 API 来将共享内存附加到另一个进程的一个进程(例如,进程 A 应该调用一个 API(如 shmat(((将共享内存附加到进程 B(。
共享内存不属于任何特定进程(除非您使用私有IPC_PRIVATE
密钥创建它(。它属于系统。
因此,当您将shmget
与非私钥(和 IPC_CREAT
标志(一起使用时,您将创建一个共享内存块或附加到现有内存块。
您需要一种方法让两个进程使用相同的 IPC 密钥,这通常是通过使用 ftok
来完成的,它使用文件规范和标识符为您提供用于shmget
调用(以及其他 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一样安全的东西:-(
让我们看看,允许一个进程强制共享内存段到另一个进程?接收器将如何处理它?它怎么知道它现在已经映射了这个块 - 对它的期望。
你以错误的方式思考问题 - 简单地将内存块提升到第二个进程上不会让你做你想做的事。您还需要通知第二个进程,它现在已经映射了此块,因此可以开始使用它进行操作。我建议你退后一步,真正看看你的设计和你在做什么。我推荐的方法是
- A 通过其他 IPC(例如套接字(连接到 B。
- A 通知 B 它应附上详细信息(姓名等(
- 然后 B 附加 - 现在 B 知道它并可以开始用它做事。(例如,一旦连接完成,B 向 A 确认,然后他们可以开始通过共享内存块进行通信(。
至于将共享内存包装在一个漂亮的库中 - 考虑 boost::interprocess。
您要求附加其他进程的进程内存,对吗?
只需open(2)
文件/proc/<pid>/mem
并使用它即可。检查/proc/<pid>/map
以获取文件中可用地址的列表。
- 是否可以通过C++扩展强制多个python进程共享同一内存
- Directx 12 :在两个进程之间共享图形内存
- 子进程更新共享 mmap 内存,但父进程没有更改
- 如何在进程之间共享大量数据而不重复?(国际刑罚委员会)
- 提升进程间共享内存open_or_create每次都会引发异常
- 提升进程间共享内存删除、权限和输出文件
- 加速进程间:管理共享内存错误
- 使用互斥锁和条件变量增强跨内存的进程间共享向量
- std::unordered_map 在共享内存中使用 boost:::进程间分配器 - 缺点?
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 提升进程间:在循环中分配共享内存
- 当多个进程使用该段时,Posix 共享内存使用 mremap 调整大小
- 在不违反严格的别名规则的情况下访问进程间共享内存中的对象
- 当一个进程截断 Boost 进程间库创建的共享内存时,进程需要重新映射
- 两个进程之间的共享映射内存在编辑时未更新
- 使用boost进程间库的phpexec共享内存和Cloudfoundry容器问题
- boost::OSX 上 32 位和 64 位程序之间共享内存中的进程间同步机制(互斥体、条件)
- C++ - 分叉进程无法从共享内存读取
- 服务和用户模式进程之间的共享全局事件不起作用
- 在资源有限的不同进程之间建立共享内存