c - 通过共享内存共享指针

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

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

最佳答案

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

其实所有对ipc的处理都是为了规避这个问题。如果您仅在 fork 之后附加这些段并打印出您从 shmat 收到的指针值您很可能会发现它们对于 parent 和 child 来说是不同的。

关于代码的其他小注释:

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

  • 在现代 POSIX 系统上,您有 shmopenmmap与旧式 IPC 调用相比,它们通常更易于使用且限制更少。

关于c - 通过共享内存共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19198851/

相关文章:

c++ - 尝试访问指针内的数组时出现段错误

c++ - 函数指针失去值(value)

c++ - 删除指针是什么意思?

lua - Lua中的进程间通信

c - 导致访问冲突的指针逻辑

C编程---如何在FILE中保存带空格的字符串并调用它们

java - 尝试通过管道将 C 中生成的数据传递给 Java 类。传递变量在java中显示为空白而不是有数据

c++ - 在堆中共享一个对象

c - dup2 的问题

C代码编译错误