【问题标题】:simple memory sharing issue简单的内存共享问题
【发布时间】:2013-12-23 14:48:32
【问题描述】:

我正在尝试在 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 个子描述符

0xb7750000 来自孩子的 ptr

来自父级的 3 个描述符

0xffffffff 来自父级的指针

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

谢谢。

【问题讨论】:

  • PROT_WRITE 用于O_RDONLY 文件描述符?

标签: linux memory posix shared-memory


【解决方案1】:

您请求的访问权限有一个小错误。在父部分中,您将O_RDONLY 传递给shm_open(),但随后您尝试将mmap() 与PROT_WRITE 一起传递,这是不允许的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2019-10-22
    • 2014-08-14
    • 2023-03-11
    相关资源
    最近更新 更多