我使用的是Linux 2.6。我有一个环境,其中两个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。
我有一个客户端进程(从父进程(即服务器)分叉),它将结构(消息)写入创建的内存映射区域(在分叉之后):
message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)
然后,该指针被写入队列(以链表的形式)到服务器和客户端进程共用的另一个共享内存区域(因为 if 是在 fork 之前使用上面相同的代码创建的)。然后服务器读取该区域,获取消息的指针并对其进行处理。
问题是 *m 是在 fork() 之后创建的,当服务器进程尝试访问指向的内存位置时,我收到分段错误。在客户端创建该内存区域后,是否可以将其附加到服务器 POST 分叉?
注意:我不想在分叉之前将指针映射到消息(然后事先与服务器共享),因为我通常不知道客户端想要发送多少消息到服务器,而且可能还有更多消息超过 1 个客户端进程,因此我想仅在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射它。
注意:这是出于学术目的:我知道这不是解决这个问题的最佳方法,但我只需要遵循这条路径。
提前致谢!
在客户端创建该内存区域后,是否可以将其附加到服务器 POST 分叉?
MAP_ANONYMOUS|MAP_SHARED
映射内存只能由执行该操作的进程访问mmap()
调用或其子进程。另一个进程无法映射相同的内存,因为该内存无法从其他地方引用,因为它是匿名的.
Using shm_open()
调用它可以创建named共享内存,可以被不相关的进程引用和映射。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)