文件'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
但我不知道它是怎麼發生的。
'man mmap:MAP_PRIVATE創建一個私人寫時複製映射。映射[...]的更新不會傳遞到底層文件。另外,你違反了嚴格的別名。 – EOF
@EOF感謝您的回覆。我已經意識到我的問題... – HuangJie