匿名映射
通過使用我們發現,使用映射區來完成文件讀寫操作十分方便,父子進程間通信也較容易。但缺陷是,每次創建映射區一定要依賴一個文件才能實現。通常為了建立映射區要open一個temp文件,創建好了再unlink、close掉,比較麻煩。 可以直接使用匿名映射來代替。其實Linux系統給我們提供了創建匿名映射區的方法,無需依賴一個文件即可創建映射區。同樣需要借助標志位參數flags來指定:MAP_ANONYMOUS (或MAP_ANON)。如:int *p = mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
"4"隨意舉例,該位置表大小,可依實際需要填寫。offset仍必須為4k的整數倍。
?
需注意的是,MAP_ANONYMOUS和MAP_ANON這兩個宏是Linux操作系統特有的宏。在其它unix和類Unix操作系統中如無該宏定義,可使用如下兩步來完成匿名映射區的建立(Linux也可以):
fd = open("/dev/zero", O_RDWR);
p = mmap(NULL, size, PROT_READ|PROT_WRITE, MMAP_SHARED, fd, 0);
Linux系統中的兩個設備文件:/dev/zero,其可以提供無窮無盡的數據,想要多大,就可以多大;/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 表示設備文件的:主設備號,從設備號
Unix操作系統發展歷史: ?丹尼斯里奇是C語言之父
Linux之父是Linus Torvalds??? 上圖中除了unix,其余都是類unix操作系統。
?
//匿名映射
#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(); //創建子進程if(pid == 0){*p = 2000;printf("child, *p = %d\n", *p);} else {sleep(1);printf("parent, *p = %d\n", *p);}munmap(p, 4); //釋放映射區return 0; }[root@localhost mmap]# ./fork_map_anon
child, *p = 2000
parent, *p = 0
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: mmap父子进程间通信
- 下一篇: 输卵管积水不孕怎么治疗