下面是我的共享内存的读写器代码。
读代码-
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;
}
在我尝试读取时写入内存后,输出是垃圾值。有人能解释一下我做错了什么吗(输出显示所有的零)谢谢
发布于 2014-01-20 06:28:06
在写部分中,您在获得共享内存地址之后使用了malloc()
,因此它将被覆盖。您应该删除malloc()
行
在read部分中,for循环应该如下所示
printf("\n%d---\n", array[i] );
发布于 2014-01-20 06:33:03
在编写代码中,尝试将共享内存附加到数组变量,并在下一步通过调用malloc将共享内存分配给用户空间(堆)中的新位置。
因此,您正在从共享内存的位置松开,并将其写入由malloc丢失的新数组中。
array = (int *)shmat(shmid, 0, 0);
array = malloc(sizeof(int)*count);
如果还想在用户空间中使用数组,或者删除该malloc行,请使用不同的指针。
共享内存将在创建内存时分配您指定的内存。你不能以后再用别的方法分配它。
发布于 2014-01-20 09:45:05
将指定偏移量处的数据保留在内存段中,该内存段可以在编译时固定,也可以放在共享内存段中某个已知位置的字段中。
使用malloc()
分配给指针的内存是该进程的私有内存。因此,当您试图访问另一个进程中的指针(不包括错误设置它的进程)时,您可能会访问一个无效的内存页或映射到另一个进程地址空间中的内存页。所以,你很可能会出现分段故障。
如果使用共享内存,则必须确保要向其他进程公开的所有数据都“在”共享内存段中,而不是进程的私有内存段中。
您可以尝试将数据保留在内存段中指定的偏移量处,这可以在编译时具体定义,也可以放在共享内存段中某个已知位置的字段中。
您的代码将通过从代码中删除malloc调用来工作。我试过了,而且效果很好
https://stackoverflow.com/questions/21227270
复制相似问题