通过共享内存共享指针

时间:2013-10-05 14:28:17

标签: c pointers ipc shared-memory

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

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而不是更新的值。这里造成的问题是什么?

1 个答案:

答案 0 :(得分:0)

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

事实上,所有与ipc的处理都是为了避免这个问题。如果您仅在fork之后附加细分,并打印出从shmat收到的指针值,则您很可能会发现它们与父母和孩子不同。

您的代码的其他次要评论:

  • C中的强制转换几乎总是错误的,你不应该需要它们。在此特别向void*投射int*。不要这样做,你可以隐藏其他微妙的错误。

  • 在现代POSIX系统上,shmopenmmap通常比旧的IPC调用更容易使用,限制更少。