我有需要在子进程和父进程之间共享的后指针和前指针。
front_ptr=(int *) shmat(shmid1,0,0);
rear_ptr=(int *) shmat(shmid1,0,0);
front=rear=-1;
front_ptr=&front;
rear_ptr=&rear;
pid1=fork();
if(pid1==0){
while(1){
wait(semid);
printf("Inside wait checker\n");
printf(" rear is %d \n",*rear_ptr);
signal(semid);
sleep(1);
}
}
else{
pid2=fork();
if(pid2==0){
while(1){
wait(semid);
printf(" rear is %d \n",*rear_ptr);
signal(semid);
sleep(1);
}
}
else{
while(1){
wait(semid);
printf("Insert\n");
insert(1,rear_ptr,front_ptr);
printf("rear is %d \n",*rear_ptr);
signal(semid);
sleep(1);
}
}
}在Insert块中,它打印正确的后指针,但其他两个进程将后指针打印为-1,而不是更新值。这里导致的问题是什么?
发布于 2013-10-06 05:05:35
进程通常不共享公共地址空间,因此您不能在共享内存中存储指针,并期望两个不同的进程通过该指针看到相同的值。因为您的两个进程来自一个fork,所以它们对在fork之前创建的所有指针使用相同的值,但实际上是为该子进程复制了整个地址空间。他们看到的唯一相同的区域是共享网段本身。
事实上,所有与ipc相关的处理都是为了绕过这个问题。如果您只将这些段附加在fork之后,并打印出从shmat接收到的指针值,那么您很可能会看到父进程和子进程的指针是不同的。
关于您的代码的其他次要说明:
C中的
int*强制转换一个void*。shmopen和mmap,它们通常比老式的IPC调用更容易使用,限制也更少。https://stackoverflow.com/questions/19198851
复制相似问题