是否可以使用 IPC 分配 2D 数组作为共享内存?

Posted

技术标签:

【中文标题】是否可以使用 IPC 分配 2D 数组作为共享内存?【英文标题】:Is it possible to allocate a 2D array as shared memory with IPC? 【发布时间】:2009-12-25 17:00:38 【问题描述】:

我想使用 IPC 将共享内存分配为二维数组。我尝试了以下方法:

id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666);

matrix = (int **)shmat(id_shmem, 0, 0);

问题是,每当我尝试向矩阵中写入内容时,都会出现段错误。

【问题讨论】:

贴出导致段错误的代码。 【参考方案1】:

int** 不是二维数组,而是一个指针数组。您不应该将指针存储在共享内存中,因为共享内存段可能在不同进程的不同地址分配。尝试使用简单、扁平的一维数组,它会用一些索引魔法“模拟”二维数组,即。

x,y -> y*width+x

【讨论】:

当性能很重要时,这也是要走的路——即使是非 IPC 使用!【参考方案2】:

共享内存中结构的常见做法是存储偏移量而不是指针。这是为了解决内存可以映射到不同进程中的不同虚拟地址的事实。 另一种常见的方法是先让进程请求操作系统提供的映射,然后以某种方式将生成的虚拟地址传递给需要附加到同一内存的所有其他进程,并让它们在该地址请求固定映射。

【讨论】:

以上是关于是否可以使用 IPC 分配 2D 数组作为共享内存?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mmap() 为 2D 数组初始化共享内存,是不是还需要为后续指针映射内存?我应该改用 shm 吗?

20155332 linux进程间通信(IPC)机制(未完成,待续)

回复:共享内存和信号量

20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

释放共享内存段

在 C++ 中的 2D 动态内存分配数组中释放分配的内存