将整数数组写入共享内存

时间:2014-01-20 06:08:42

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

以下是我的共享内存的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;
}

当我尝试读取时写入内存后,输出是垃圾值。有人可以解释我做错了什么(输出显示全部为零)谢谢你

4 个答案:

答案 0 :(得分:3)

在写入部分,您在获取共享内存地址后使用malloc(),因此它将被覆盖。您应该删除malloc()

在读取部分中,for循环应该如下所示

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

答案 1 :(得分:1)

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

所以你丢失了共享内存所在的位置,并写入了由malloc放置的新数组。

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

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

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

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

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

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

您的代码可以通过从代码中删除malloc调用来实现。我已经尝试过并且工作正常