【问题标题】:sharing pointers via shared memory通过共享内存共享指针
【发布时间】:2013-10-05 14:28:17
【问题描述】:

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

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

【问题讨论】:

    标签: c pointers ipc shared-memory


    【解决方案1】:

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

    其实所有与ipc打交道都是为了规避这个问题。如果您只在fork 之后附加这些段并打印出您从shmat 收到的指针值,那么您很可能会发现它们对于父级和子级是不同的。

    对您的代码的其他小注释:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多