2013-10-05 49 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調用更易於使用並且具有更少的限制。