mmapped区域中的malloc

时间:2017-04-17 00:44:35

标签: c mmap

我正在尝试编写一个程序,使进程能够通过共享内存区域进行通信。

我使用的代码如下:

struct shared {
    int a;
    char *f;
}

int main() {

    struct shared *f = (struct shared *) mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);

    f -> f = calloc(1,10);

    pid_t pid = fork();

    if (pid < 0) {
        //handle error
    }

    else if (pid == 0) {

        //Child
        while(1) {
            printf("f -> f = %s\n", f -> f);
            sleep(1);
        }

        exit(0);

    }

    else {

      //Parent

      int i=0;
      while(1) {
          sleep(1);
          sprintf(f -> f, "A %d", i++);
      }

      wait(NULL);

      free(f -> f);
      munmap(f, sizeof(struct shared));
      exit(0);
    }

}

当我尝试执行此操作时,它会编译并运行而不会出现错误,但我注意到子进程从不接收&#34;虽然我已在MAP_SHARED调用中指定了mmap标记,但父级写入的数据仍然存在。

当我在结构字段中使用char f[10]而不是char *f时,子进程会接收父进程发送的数据。

是否真的不可能在共享内存区域中使用malloc / calloc分配内存?

1 个答案:

答案 0 :(得分:3)

这可能是因为f->f = calloc(1,10);,因为儿童无法获得此内存。

与映射结构类型的内存相同,您也需要对f字段执行相同的操作。

现在,孩子会看到一个他们不一定能够访问的指针。

当您从char* f转到char f[10]时,f的类型将是已知固定大小的字符,而不是可能无法访问的指针。因此f[10]方式将使用映射区域存储数据。