gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:19:18 26 4
gpt4 key购买 nike

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

我有一个客户端进程(从父进程派生,即服务器),它将结构(消息)写入(在派生之后)创建的内存映射区域:

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

然后这个指针被写入一个队列(以链表的形式)到另一个共享内存区域,这是服务器和客户端进程共有的(因为 if 是在 fork 之前用上面相同的代码创建的)。然后服务器读取该区域,服务器获取指向消息的指针并对其进行处理。

问题是 *m 是在 fork() 之后创建的,当服务器进程试图访问指向的内存位置时,我得到一个段错误。是否可以在客户端创建该内存区域后将其附加到服务器 POST fork ?

注意:我不想在 fork 之前将指针映射到消息(然后先与服务器共享它),因为我通常不知道客户端想要向服务器发送多少消息,而且还有可能不止 1 个客户端进程,所以我只想在客户端需要发送消息时创建一个新的共享内存块,并在服务器收到该消息后取消映射。

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

提前致谢!

最佳答案

Is it possible to attach that region of memory to the server POST forking, after the client creates it?

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

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

关于c - 通过使用 mmap() 在进程之间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com