2013-10-05 206 views
0

我有后端指针和前端指针,我需要在子进程和父进程之间共享。通过共享内存共享指针

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); 
     } 
    } 
} 

在插入阻止它打印正确的后方指针但其他两个处理打印后为-1,而不是更新后的值。这里引起的问题是什么?

回答

0

进程通常不共享公共地址空间,因此无法将指针存储在共享内存中,并希望两个不同的进程通过该指针看到相同的值。由于您的两个进程来自fork,因此对于在fork之前创建的所有指针,它们使用相同的,但实际上整个地址空间都是针对子级复制的。他们看到的唯一区域是共享的细分市场本身。

事实上,所有与ipc打交道都是为了规避这个问题。如果您只在fork之后附加细分,并打印出您从shmat收到的指针值,那么您很可能会看到它们对于父母和小孩而言是不同的。您的代码

其他小的话:

  • 管型C是几乎总是错的,你不应该需要他们。在这里特别是你投了void*int*。不要那样做,你可以隐藏其他细微的错误。

  • 在现代POSIX系统上,您有shmopenmmap,它们通常比旧式IPC调用更易于使用并且具有更少的限制。