将共享内存指针类型转换为整数指针

分享于2022年07月17日 c++ linux shared-memory ubuntu 问答
【问题标题】:将共享内存指针类型转换为整数指针(type casting shared memory pointer to integer pointer)
【发布时间】:2022-07-10 23:23:18
【问题描述】:
int main()
{
    key_t key = ftok("yu", 65);
    int shmid = shmget(key, 100 * sizeof(int), 0666 | IPC_CREAT);
    int** Matr = (int**)shmat(shmid, (void*)0, 0);

    for (int i = 0; i<3; i++)
    {
        for (int j = 0; j<3; j++)
        {
            Matr[i][j] = i + j; // writing to shared memory
        }
    }

    shmdt(Matr);
    return 0;
}

我正在尝试将共享内存指针类型转换为整数双指针,但是每次编译代码时,它都会显示分段错误(核心转储)。有人可以告诉我该怎么做吗?提前致谢。

P.S : 我在 C++ 上做这个。

  • 每个进程都有自己的地址空间,如果你真的在它们之间共享一个指针,不要。否则请显示 minimal reproducible example
  • 如果您收到任何编译错误/警告 - 请分享。 “每次我编译代码时,它都会说分段错误” - 分段错误 是运行时问题(不是编译问题),除非您的意思是编译器本身崩溃了。
  • @Quimby 那么你有什么建议?这是我的任务,我需要通过创建等于列数的进程,使用共享内存逐列添加两个矩阵。
  • @Quimby 我认为共享内存的使用原则上是有效的。每个进程都有自己的指针,但底层数据将在进程之间共享。
  • 附注:在“现实生活”中,我会使用线程(在一个进程中)而不是进程来执行这样的任务。线程更轻量级,并且共享内存地址空间。

【解决方案1】:

你可以试试下面的代码。

主要区别在于矩阵是用一个 1D 连续的内存块(一个数组)实现的,因此 Matr 的类型是 int*

通过从 2 个矩阵索引 ( i,j ) 计算数组中的索引 ( idx ) 来“手动”管理矩阵的 2D 索引。

注意: 我建议您为所有系统调用添加错误处理。

#include 
#include 

int main()
{
    key_t key = ftok("yu", 65);
    // check if key is -1 and if so handle the error ...
    int shmid = shmget(key, 100 * sizeof(int), 0666 | IPC_CREAT);
    // check if shmid is -1 and if so handle the error ...
    int* Matr = (int*)shmat(shmid, (void*)0, 0);
    // check if Matr is (void*)-1 and if so handle the error ...

    int width = 3;
    int height = 3;
    // NOTE: width * height must be <= 100 (according to the declared size of the shared memory).

    for (int j = 0; j