如何读取/写入匿名共享映射?

尝试使用子进程将消息写入匿名共享内存,然后终止它。 然后让父母读取消息。 我已经看到了使用通过write调用获得的文件描述符来映射输入和输出文件的示例。 但不知道如何正确处理这个问题。

 int main(void) { char *shared; int status; pid_t child; shared = mmap(0, sizeof(int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (shared == MAP_FAILED) { perror("mmap"); return 1; } child = fork(); if ( child == -1 ) { perror("fork"); return 1; } else if (child == 0) { sprintf(shared, "foo"); } else { printf("%s", shared); wait(&status); } if (munmap (shared, sizeof(int)) == -1) { perror("munmap"); return 1; } return 0; } 

如果您的唯一目标是在子进程和父进程之间进行读/写,则使用管道是一种更容易实现的方法。 它看起来像这样:

  int fd[2]; pipe(fd); if((child= fork()) == -1) { perror("fork"); exit(1); } if(child == 0) { // close read side close(fd[0]); // write to pipe write(fd[1], msg, (strlen(msg)); } else { //close write side close(fd[1]); //read what the child wrote. nbytes = read(fd[0], buff, sizeof(buff)); } 

如果您打算使用共享内存,那么尝试通过对底层文件的read()write()调用来操作它是愚蠢的read()无论如何都不存在匿名映射)。 如果你想通过read()write()进行通信,那么只需创建一个管道,忘记映射和共享内存。 这实际上是一种完全可行的方法。

如果你真的想为此使用共享内存,那么就像内存一样使用它。 将指向共享内存区域的指针转换为适当的指向对象类型,使用普通赋值进行写入,并使用普通变量/内存访问进行读取。 共享内存确实引入了冲突访问和同步的潜在问题,但即使对于您描述的简单情况也没有大问题:只需让父进程成功wait() (或以其他方式通知其终止),然后再尝试阅读孩子所写的一切。

但是,确实存在设置映射的问题:映射sizeof(int)字节,但这对于您尝试编写的消息可能不够。 总的来说,它应该看起来更像这样:

 int main(void) { char *message; int status; pid_t child; message = mmap(NULL, BUFSIZE , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (message == MAP_FAILED) { perror("mmap"); return 1; } child = fork(); if ( child == -1 ) { perror("fork"); return 1; } else if (child == 0) { strcpy( message, "foo\n"); } else { wait(&status); printf("The child wrote:\n%s\n", message); } return 0; }