我在Linux 2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。通过使用mmap在进程之间共享内存
我有一个客户端进程(从父,这是服务器分叉),其与写入一个结构(消息),以创建的存储器映射区域(后叉):
message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)
这然后将指针写入队列(以链表的形式)到另一个共享内存区域,该区域对于服务器和客户端进程是通用的(因为如果在fork之前创建了相同的代码)。然后服务器读取该区域,获取消息指针并对其进行处理。
的问题是,* m是fork()和当所述服务器进程试图访问被指向的存储器位置,得到了一个分割错误之后创建的。在客户端创建它之后,是否可以将该内存区域附加到服务器POST分叉?
注意:我不希望在分叉之前将指针指向消息(然后再与服务器共享),因为我通常不知道客户端要发送给服务器的消息数量,以及可能有超过1个客户端进程,所以我只想在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射。
注意:这是为学术目的:我知道这是不是解决这个问题的最好办法,但我只需要按照这条道路。
在此先感谢!
谢谢!我用`shm_open()`然后用`mmap()`给出了fd,它部分地解决了这个问题。在fd是mmap之后,是否可以重命名(使用rename()`)我提供给`shm_open()`的“tag”字符串?我试过这样做,但后来,当我尝试从另一个使用重命名标记的进程使用`shm_open()`时,我得到一个运行时“总线错误”。 注意:我注意到在/ sys/shm /重命名文件存在,所以重命名似乎成功。 – 2011-02-14 16:25:12