线程的 mmap 中 MAP_PRIVATE 和 MAP_SHARED 之间的区别

Hua*_*Jie 0 c mmap pthreads

文件 'hello' 的内容是hello.

$ od -tx1 -tc hello 
0000000 68 65 6c 6c 6f 0a
          h   e   l   l   o  \n
0000006
Run Code Online (Sandbox Code Playgroud)

下面是我对文件“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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码我用的MAP_PRIVATE,貌似子线程不行。如果我更改MAP_PRIVATEMAP_SHARED,我会发现它与我期望的不同。

$ od -tx1 -tc hello
 0000000 33 32 31 30 6f 0a
           3   2   1   0   o  \n
 0000006
Run Code Online (Sandbox Code Playgroud)

但我不知道它是如何发生的。

use*_*342 6

这与线程无关,如果您在主线程中进行修改,您将获得相同的结果。的重点MAP_PRIVATE不是将修改传播到底层对象(在本例中为文件)。这在手册中有描述:

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

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