首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过共享内存共享指针

通过共享内存共享指针
EN

Stack Overflow用户
提问于 2013-10-05 22:28:17
回答 1查看 203关注 0票数 0

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

代码语言:javascript
复制
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,而不是更新值。这里导致的问题是什么?

EN

回答 1

Stack Overflow用户

发布于 2013-10-06 05:05:35

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

事实上,所有与ipc相关的处理都是为了绕过这个问题。如果您只将这些段附加在fork之后,并打印出从shmat接收到的指针值,那么您很可能会看到父进程和子进程的指针是不同的。

关于您的代码的其他次要说明:

C中的

  • 类型转换几乎总是错误的,你不应该需要它们。特别是在这里,您正在向int*强制转换一个void*
  • 在现代的POSIX系统上,你可以使用shmopenmmap,它们通常比老式的IPC调用更容易使用,限制也更少。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19198851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档