【发布时间】:2011-06-26 20:47:06
【问题描述】:
我在 Linux 2.6 中。我有一个环境,其中 2 个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。
我有一个客户端进程(从父进程派生,即服务器),它将结构(消息)写入(在派生之后)创建的内存映射区域:
message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)
这个指针然后被写入一个队列(以链表的形式)到另一个共享内存区域,这是服务器和客户端进程共有的(因为 if 是在 fork 之前使用上面相同的代码创建的)。然后服务器读取该区域,获取指向消息的指针并进行处理。
问题是 *m 是在 fork() 之后创建的,当服务器进程尝试访问指向的内存位置时,我得到一个分段错误。在客户端创建后,是否可以将该内存区域附加到服务器 POST 分叉?
注意:我不想在分叉之前将指针映射到消息(然后与服务器共享它),因为我通常不知道客户端想要发送到服务器的消息数量,以及那里可能有多个客户端进程,所以我想仅在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射。
注意:这是出于学术目的:我知道这不是解决此问题的最佳方法,但我只需要遵循此路径。
提前致谢!
【问题讨论】:
标签: c linux ipc shared-memory mmap