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

在 Insert 块中,它打印正确的后指针,但其他两个进程将后打印为 -1 而不是更新的值。这里造成的问题是什么?

4

1 回答 1

0

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

事实上,所有与ipc打交道都是为了规避这个问题。如果您仅在您fork和打印出您从您收到的指针值之后附加这些段,shmat您很可能会看到它们对于父母和孩子来说是不同的。

关于您的代码的其他小注释:

  • C 中的强制转换几乎总是错误的,你不应该需要它们。特别是在这里,您正在投射void*int*. 不要那样做,你可以用它来隐藏其他细微的错误。

  • 在您拥有的现代 POSIX 系统上shmopenmmap这些系统通常比旧的 IPC 调用更易于使用且限制更少。

于 2013-10-05T21:05:34.787 回答