匿名映射
通過使用我們發(fā)現(xiàn),使用映射區(qū)來完成文件讀寫操作十分方便,父子進(jìn)程間通信也較容易。但缺陷是,每次創(chuàng)建映射區(qū)一定要依賴一個文件才能實現(xiàn)。通常為了建立映射區(qū)要open一個temp文件,創(chuàng)建好了再unlink、close掉,比較麻煩。 可以直接使用匿名映射來代替。其實Linux系統(tǒng)給我們提供了創(chuàng)建匿名映射區(qū)的方法,無需依賴一個文件即可創(chuàng)建映射區(qū)。同樣需要借助標(biāo)志位參數(shù)flags來指定:MAP_ANONYMOUS (或MAP_ANON)。如:int *p = mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
"4"隨意舉例,該位置表大小,可依實際需要填寫。offset仍必須為4k的整數(shù)倍。
?
需注意的是,MAP_ANONYMOUS和MAP_ANON這兩個宏是Linux操作系統(tǒng)特有的宏。在其它unix和類Unix操作系統(tǒng)中如無該宏定義,可使用如下兩步來完成匿名映射區(qū)的建立(Linux也可以):
fd = open("/dev/zero", O_RDWR);
p = mmap(NULL, size, PROT_READ|PROT_WRITE, MMAP_SHARED, fd, 0);
Linux系統(tǒng)中的兩個設(shè)備文件:/dev/zero,其可以提供無窮無盡的數(shù)據(jù),想要多大,就可以多大;/dev/null,為黑洞文件,可以吞掉一切東西,類似回收站,只是不可以回收,徹底刪除(可以管道重定向到該文件,清理屏幕)。
[root@localhost mmap]# ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 Mar 29 23:32 /dev/null
1,3 表示設(shè)備文件的:主設(shè)備號,從設(shè)備號
Unix操作系統(tǒng)發(fā)展歷史: ?丹尼斯里奇是C語言之父
Linux之父是Linus Torvalds??? 上圖中除了unix,其余都是類unix操作系統(tǒng)。
?
//匿名映射
#include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h>int main(void) {int *p;pid_t pid;int fd;fd = open("/dev/zero", O_RDWR);p = mmap(NULL, 400, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);if(p == MAP_FAILED){ perror("mmap error");exit(1);}pid = fork(); //創(chuàng)建子進(jìn)程if(pid == 0){*p = 2000;printf("child, *p = %d\n", *p);} else {sleep(1);printf("parent, *p = %d\n", *p);}munmap(p, 4); //釋放映射區(qū)return 0; }[root@localhost mmap]# ./fork_map_anon
child, *p = 2000
parent, *p = 0
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: mmap父子进程间通信
- 下一篇: mmap无血缘关系进程间通信