【问题标题】:Read Write Integer Array Into Shared Memory将整数数组读入共享内存
【发布时间】:2014-01-20 06:08:41
【问题描述】:

以下是我的共享内存的 READER-WRITER 代码。

阅读代码-

int main(){
int shmid;
int *array;
int count = 5;
int i = 0;
key_t key = 12345;

shmid = shmget(key, count*sizeof(int), IPC_EXCL);

array = shmat(shmid, 0, SHM_RDONLY);

for(i=0; i<5; i++)
    {
        printf("\n%d---\n", array[i] );
    }

    printf("\nRead to memory succesful--\n");

    shmdt((void *) array);
    return 0;
}

编写代码-

int main()
{
int shmid;
int *array;
int count = 5;
int i = 0;
int SizeMem;
key_t key = 12345;

SizeMem = sizeof(*array)*count;

shmid = shmget(key, count*sizeof(int), IPC_CREAT);

array = (int *)shmat(shmid, 0, 0);

array = malloc(sizeof(int)*count);

for(i=0; i<5; i++)
{
    array[i] = i;
}

for(i=0; i<count; i++)
{
    printf("\n%d---\n", array[i]);
}

printf("\nWritting to memory succesful--\n");

shmdt((void *) array);

return 0;
}

当我尝试读取时写入内存后,输出是垃圾值。谁能解释一下我做错了什么(输出显示全为零)谢谢

【问题讨论】:

  • 在写入部分,您将使用 malloc 的返回地址覆盖数组指针并写入堆分配而不是共享内存。 malloc 是不必要的。
  • 从 shmat 获取值后,您正在 malloc'ing 数组。有效地摆脱价值观。
  • @AnshDavid 测试了您的代码,删除了我在回答中提到的行,它在我的机器上运行正常。我应该没问题。

标签: c linux gcc shared-memory read-write


【解决方案1】:

在写部分,你在获取共享内存地址后使用了malloc(),所以它会被覆盖。您应该删除 malloc()

在读取部分,for循环应该是这样的

printf("\n%d---\n", array[i] );

【讨论】:

    【解决方案2】:

    你的 malloc 在这里覆盖了 shmat 的返回值。你写的不是共享内存,而是你刚刚 malloc 的内存。

    array = (int *)shmat(shmid, 0, 0);
    

    删除此行。您的代码在我的机器上运行正常。

    数组 = malloc(sizeof(int)*count);

    【讨论】:

      【解决方案3】:

      将指定偏移量的数据留在内存段中,可以在编译时固定或放置在共享内存段中某个已知位置的字段中

      使用malloc() 分配给指针的内存是该进程私有的。因此,当您尝试访问另一个进程(分配它的进程除外)中的指针时,您可能会访问无效的内存页或映射到另一个进程地址空间的内存页。因此,您很可能会遇到段错误。

      如果您正在使用共享内存,则必须确保要向其他进程公开的所有数据都“在”共享内存段中,而不是进程的私有内存段。

      您可以尝试将数据保留在内存段中的指定偏移量处,该偏移量可以在编译时具体定义或放置在共享内存段中某个已知位置的字段中。

      您的代码可以通过从代码中删除 malloc 调用来工作。我试过了,效果很好

      【讨论】:

        【解决方案4】:

        编写代码中,您尝试将共享内存附加到数组变量,并且在下一步中,您通过调用 malloc 将其分配给用户空间(堆)中的新位置。

        因此,您正在丢失共享内存所在的位置并写入由 malloc 定位的新数组。

        array = (int *)shmat(shmid, 0, 0);
        array = malloc(sizeof(int)*count);
        

        如果您还想在用户空间中创建一个数组,请使用不同的指针,或者删除该 malloc 行。

        共享内存将在创建时分配您指定的内存。以后不能通过其他方式分配。

        【讨论】:

          猜你喜欢
          • 2020-02-22
          • 1970-01-01
          • 1970-01-01
          • 2021-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-11
          • 1970-01-01
          相关资源
          最近更新 更多