我正在尝试编写一个程序,使进程能够通过共享内存区域进行通信。
我使用的代码如下:
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/