如何解决共享内存中用于两个进程的结构数组
| 我正在尝试创建一个结构数组,以便使用\“ shmget \”在父进程和子进程之间共享。我正在遵循教授的模板,但是他的模板不包含结构和数组(共享内存仅存储一个int)。以下代码编译时没有警告,但返回\“ 0 \”作为输出,我希望看到\“ a 10 \”。我究竟做错了什么? 当我尝试在子进程中声明新变量时,我也遇到了麻烦,我看到了其他可以在其中运行的示例,但是我不知道为什么每次都要在派生之前被迫声明它们。typedef struct {
char character;
int number;
} item;
int main(int argc,char *argv[])
{
int mem_id;
mem_id = shmget(IPC_PRIVATE,10*sizeof(item),SHM_R | SHM_W);
item * x;
item * y;
item * list[10];
switch(fork())
{
case -1:
perror(\"Bad fork()\"); exit(1);
case 0:
*list = shmat(mem_id,NULL,0);
if ((int *) list == (int *) -1)
{perror(\"Child cannot attach\"); exit(1);}
x->character = \'a\';
x->number = 10;
list[0] = x;
shmdt(list);
exit(0);
default:
*list = shmat(mem_id,0);
if ((int *) list == (int *) -1)
{perror(\"Child cannot attach\"); exit(1);}
wait((int *)0);
y = list[0];
shmdt(list);
printf(\"%c %d\\n\",y->character,y->number);
if (shmctl(mem_id,IPC_RMID,0) <0)
{ perror(\"cannot remove shared memory\"); exit(1);}
return 0;
}
return 0;
}
解决方法
我很惊讶您没有进行以下操作:
您不会像Nemo所指出的那样初始化x
您的数组“列表”实际上是指向Items的指针数组,而不是Items数组。
最重要的是。在打印出y中的值之前,请先分离共享内存。
该代码应如下所示:
typedef struct {
char character;
int number;
} item;
int main(int argc,char *argv[])
{
int mem_id;
mem_id = shmget(IPC_PRIVATE,10*sizeof(item),SHM_R | SHM_W);
item *x;
item *y;
item *list;
switch(fork())
{
case -1:
perror(\"Bad fork()\"); exit(1);
case 0:
list = (item *)shmat(mem_id,NULL,0);
if ((void *) -1 == (void *)list)
{
perror(\"Child cannot attach\"); exit(1);
}
x = list;
x->character = \'a\';
x->number = 10;
shmdt(list); // No need for this
exit(0);
default:
list = (item *)shmat(mem_id,0);
if ((void *) list == (void *) -1)
{
perror(\"Child cannot attach\"); exit(1);
}
wait((int *)0);
y = list;
printf(\"%c %d\\n\",y->character,y->number);
shmdt(list);
if (shmctl(mem_id,IPC_RMID,0) <0)
{ perror(\"cannot remove shared memory\"); exit(1);}
return 0;
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。