我正在尝试编写一个程序,使进程能够通过共享内存区域进行通信。
我使用的代码如下:
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分配内存?
答案 0 :(得分:3)
这可能是因为f->f = calloc(1,10);
,因为儿童无法获得此内存。
与映射结构类型的内存相同,您也需要对f
字段执行相同的操作。
现在,孩子会看到一个他们不一定能够访问的指针。
当您从char* f
转到char f[10]
时,f
的类型将是已知固定大小的字符,而不是可能无法访问的指针。因此f[10]
方式将使用映射区域存储数据。