一尘不染

通过使用mmap()在进程之间共享内存

linux

我在Linux 2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。

我有一个客户端进程(从父进程(即服务器)派生),该进程将struct(消息)写入使用以下命令创建的内存映射区域(在派生之后):

message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)

然后将此指针以链接列表的形式写入到另一个共享内存区域中的队列中,该共享内存区域对于服务器和客户端进程是通用的(因为如果在派生之前使用上面的相同代码创建了该指针)。然后由服务器读取该区域,该服务器获取指向消息的指针并进行处理。

问题是*
m是在fork()之后创建的,并且当服务器进程尝试访问指向的内存位置时,出现分段错误。客户端创建内存后,是否可以将该内存区域附加到服务器的POST分支中?

注意:我不想在派生之前映射消息的指针(然后在与服务器共享之前),因为我通常不知道客户端要发送到服务器的消息数量,而且可能还有更多多于一个客户端进程,因此我只想在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射。

注意:这是出于学术目的:我知道这不是解决此问题的最佳方法,但我只需要遵循此路径即可。

提前致谢!


阅读 514

收藏
2020-06-03

共1个答案

一尘不染

客户端创建内存后,是否可以将该内存区域附加到服务器的POST分支中?

MAP_ANONYMOUS|MAP_SHARED映射的内存只能由执行该mmap()调用的进程或其子进程访问。另一个进程无法映射相同的内存,因为该内存是
匿名的 ,因此无法从其他位置引用该内存。

使用shm_open()调用可以创建 命名的 共享内存,不相关的进程可以引用和映射该共享内存。

2020-06-03