我正在使用Linux 2.6。我有一个环境,其中有两个进程通过共享内存模拟数据交换,以简单的消息传递模式实现。
我有一个客户端进程(由父进程(即服务器)fork出),它将一个结构体(消息)写入到创建的内存映射区域中(在fork之后):
问题是*m是在fork()之后创建的,当服务器进程尝试访问指向的内存位置时,会出现分段错误。是否可能在客户端创建它后,在POST forking时将那个内存区域附加到服务器?
注意:我不想在fork之前将指向消息的指针mmap(然后与服务器共享),因为我通常不知道客户端要发送给服务器多少条消息,并且可能会有多个客户端进程,因此我想在客户端需要发送消息时创建一个新的共享内存块,并在服务器接收到该消息后取消映射它。
注意:这是为了学术目的:我知道这不是解决此问题的最佳方法,但我只需要遵循这条路径。
提前感谢!
我有一个客户端进程(由父进程(即服务器)fork出),它将一个结构体(消息)写入到创建的内存映射区域中(在fork之后):
message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)
这个指针然后被写入到另一个共享内存区域(以链表形式)的队列中,该区域是服务器和客户端进程共用的(因为它是在fork之前使用相同的代码创建的)。然后服务器读取这个区域并获得指向消息的指针,对其进行处理。问题是*m是在fork()之后创建的,当服务器进程尝试访问指向的内存位置时,会出现分段错误。是否可能在客户端创建它后,在POST forking时将那个内存区域附加到服务器?
注意:我不想在fork之前将指向消息的指针mmap(然后与服务器共享),因为我通常不知道客户端要发送给服务器多少条消息,并且可能会有多个客户端进程,因此我想在客户端需要发送消息时创建一个新的共享内存块,并在服务器接收到该消息后取消映射它。
注意:这是为了学术目的:我知道这不是解决此问题的最佳方法,但我只需要遵循这条路径。
提前感谢!
shm_open()
,然后使用给定的fd进行了mmap()
,这在一定程度上解决了问题。在使用rename()
重命名我提供给shm_open()
的“tag”字符串之后,是否可以重新命名?我尝试过这样做,但是当我尝试使用重命名后的标签从另一个进程中使用shm_open()
时,会出现运行时“总线错误”。注意:我注意到在/sys/shm/中,已经存在重命名的文件,因此似乎重命名成功了。 - Andrea Spregashm_open()
会导致SIGBUS
吗? - Maxim Egorushkin