【问题标题】:difference between MAP_PRIVATE and MAP_SHARED in mmap for threads线程的 mmap 中 MAP_PRIVATE 和 MAP_SHARED 之间的区别
【发布时间】:2016-01-07 04:47:26
【问题描述】:

文件'hello'的内容是hello

$ od -tx1 -tc hello 
0000000 68 65 6c 6c 6f 0a
          h   e   l   l   o  \n
0000006

下面是我对文件“hello”进行一些更改的代码。

static void *task();

int main(void)
{
    int *p;
    pthread_t Thread;
    int fd = open("hello", O_RDWR);
    if (fd < 0) {
        perror("open hello");
        exit(1);
    }
    p = mmap(NULL, 6, PROT_WRITE, MAP_PRIVATE, fd, 0);
    if (p == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }
    close(fd);
    pthread_create(&Thread, NULL, &task, p)
    printf("Help");
    pthread_join(Thread, 0);
    munmap(p, 6);
    return 0;
}

static void * task(int *r)
{
 r[0] = 0x30313233;
}

上面的代码我用了MAP_PRIVATE,好像子线程不行。 如果我将 MAP_PRIVATE 更改为 MAP_SHARED,我会发现它会产生预期的不同。

$ od -tx1 -tc hello
 0000000 33 32 31 30 6f 0a
           3   2   1   0   o  \n
 0000006

但我不知道它是怎么发生的。

【问题讨论】:

  • man mmap: MAP_PRIVATE Create a private copy-on-write mapping. Updates to the mapping [...] are not carried through to the underlying file.。此外,您还违反了严格的别名。
  • @EOF 感谢您的回复。我已经意识到我的问题...

标签: c pthreads mmap


【解决方案1】:

这与线程无关,如果在主线程中进行修改会得到相同的结果。 MAP_PRIVATE 的全部意义在于不将修改传播到底层对象(在本例中为文件)。这在the manual 中有描述:

MAP_PRIVATE - 创建一个私有的写时复制映射。更新到 该映射对映射同一文件的其他进程不可见, 并且不会传递到基础文件。未指定 mmap() 调用后对文件所做的更改是否可见 在映射区域中。

换句话说,MAP_PRIVATE 为您提供了一个内存区域,供您的进程(在其所有线程中)和分叉的子进程私有使用,这些子进程不会被写入任何地方。您可以将其视为malloc() 的替代品。

【讨论】:

  • 我是多么愚蠢...感谢您的时间和回复。
【解决方案2】:

阅读manual 总是一个好主意,因为它会告诉您确切的原因。

MAP_SHARED

分享此映射。映射此文件的其他进程可以看到对映射的更新,并传递到 基础文件。在 msync(2) 之前,该文件可能不会真正更新 或 munmap() 被调用。

MAP_PRIVATE

创建一个私有的写时复制映射。映射的更新对于映射同一文件的其他进程不可见,并且不 传递到底层文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-01-22
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多