c - 映射区域中的 malloc

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

}

当我尝试执行它时,它编译并运行没有错误,但我注意到子进程从不“接收”父进程写入的数据,尽管我在中指定了 MAP_SHARED 标志mmap 调用。

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

在共享内存区用malloc/calloc分配内存真的不可能吗?

最佳答案

这可能是因为 f->f = calloc(1,10); 因为 child 无法访问此内存。

与为结构类型映射内存一样,您也需要为 f 字段做同样的事情。

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

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

关于c - 映射区域中的 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43443678/

相关文章:

c - `mmap()` 手动并发预故障/分页

linux - mmap 是如何工作的?

c - 在ubuntu 12.04中使用C发送AT命令到teltonika GSM调制解调器

c - 将字符串的每个单词放入C中的数组中

c - _Generic assoc-list 中的函数指针类型是否没有按预期工作?

linux - 在 fork 之前或之后在磁盘文件上调用 mmap() 有什么区别?

linux - 为什么 munmap 需要一个长度作为参数?

c - 查找基数 K 中的第 n 个回文素数

c++ - 单声道嵌入: How to access type of a property in C/C++

linux - Linux给malloc()分配了多少内存?