2015-10-09 75 views
0

文件'hello'的內容是hello線程的mmap中的MAP_PRIVATE和MAP_SHARED之間的區別

$ 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 

但我不知道它是怎麼發生的。

+0

'man mmap:MAP_PRIVATE創建一個私人寫時複製映射。映射[...]的更新不會傳遞到底層文件。另外,你違反了嚴格的別名。 – EOF

+0

@EOF感謝您的回覆。我已經意識到我的問題... – HuangJie

回答

3

這與線程無關,如果您在主線程中進行了修改,則會得到相同的結果。 MAP_PRIVATE的整點不是要將修改傳播到底層對象(在本例中爲文件)。這在the manual中描述:

MAP_PRIVATE - 創建一個私人寫時複製映射。對 的更新映射對映射相同文件的其他進程不可見, 並且不會傳遞到底層文件。沒有指定 在mmap()調用後對文件所做的更改在映射區域中是否可見 。

換句話說,MAP_PRIVATE讓你的內存區域供私人使用的過程中(在其所有線程)和分叉的子過程,不會在任何地方寫。您可以將其視爲替代malloc()

+0

我是多麼愚蠢......感謝您的時間和答覆。 – HuangJie

0

總是一個好主意,閱讀manual,因爲它確切地告訴你爲什麼。

MAP_SHARED

分享該映射。映射的更新對映射此文件的其他進程可見,並被帶到 底層文件。在調用msync(2) 或munmap()之前,文件可能不會實際更新。

MAP_PRIVATE

創建一個私人寫時複製映射。映射的更新對映射相同文件的其他進程不可見,而且並不是 通向底層文件

+0

已注意。非常感謝。 – HuangJie