首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将整数数组读写到共享内存中

将整数数组读写到共享内存中
EN

Stack Overflow用户
提问于 2014-01-20 06:08:41
回答 3查看 36.5K关注 0票数 5

下面是我的共享内存的读写器代码。

读代码-

代码语言:javascript
运行
复制
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;
}

写代码-

代码语言:javascript
运行
复制
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;
}

在我尝试读取时写入内存后,输出是垃圾值。有人能解释一下我做错了什么吗(输出显示所有的零)谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-20 06:28:06

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

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

代码语言:javascript
运行
复制
printf("\n%d---\n", array[i] );
票数 4
EN

Stack Overflow用户

发布于 2014-01-20 06:33:03

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

因此,您正在从共享内存的位置松开,并将其写入由malloc丢失的新数组中。

代码语言:javascript
运行
复制
array = (int *)shmat(shmid, 0, 0);
array = malloc(sizeof(int)*count);

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

共享内存将在创建内存时分配您指定的内存。你不能以后再用别的方法分配它。

票数 1
EN

Stack Overflow用户

发布于 2014-01-20 09:45:05

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

使用malloc()分配给指针的内存是该进程的私有内存。因此,当您试图访问另一个进程中的指针(不包括错误设置它的进程)时,您可能会访问一个无效的内存页或映射到另一个进程地址空间中的内存页。所以,你很可能会出现分段故障。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21227270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档