linux - 简单的内存共享问题

标签 linux memory posix shared-memory

我正在尝试模拟 ubuntu 上两个进程之间的简单共享内存。这是代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

int main() {

pid_t pid = fork();

if (pid == 0) {     //Child
        int shm_fd = shm_open("JSHM", O_CREAT | O_RDWR, 0666);
        ftruncate(shm_fd, 4096);
        void *ptr = mmap(0, 4096, PROT_WRITE, MAP_SHARED, shm_fd, 0);
        sprintf(ptr, "Jani");
        printf("%i descriptor from child\n", shm_fd);
        printf("%p ptr from child\n\n", ptr);
}
if (pid > 0) {      //Parent
        sleep(5);
        int shm_fd = shm_open("JSHM", O_RDONLY, 0666);
        printf("%i descriptor from parent\n", shm_fd);
        void *ptr = mmap(0, 4096, PROT_WRITE, MAP_SHARED, shm_fd, 0);
        //printf("%s", (char *)ptr);
        printf("%p ptr from parent\n", ptr);
}

}

输出:

3 个来自 child 的描述符

0xb7750000 来自 child 的 ptr

3 来自父级的描述符

0xffffffff 来自父级的 ptr

为什么第二个 mmap(来自父级)不起作用?

谢谢。

最佳答案

您请求的访问权限存在轻微错误。在父部分中,您将 O_RDONLY 传递给 shm_open() 但随后您尝试使用 mmap() 它PROT_WRITE 这是不允许的。

关于linux - 简单的内存共享问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745835/

相关文章:

c - 映射: Cannot allocate memory

MySQL 内存注意事项

signals - 带有 posix 信号列表的手册页?

android - 使用 "su"命令时出现错误

linux - 在环回上挂载 rootfs

c++ - malloc/new 是否从缓存或 RAM 返回内存块?

C 信号量值

c - 从信号处理程序返回并使信号屏蔽

linux - Apache httpd 与 Tomcat 7 : port 80 vs. 端口 8080

linux - 我在将 mod_ssl 安装到我的 AWS Apache 实例时遇到问题