Linux学习之系统编程篇:mmap练习
生活随笔
收集整理的這篇文章主要介紹了
Linux学习之系统编程篇:mmap练习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、利用 mmap 讀取磁盤文件內容
// 需求:將文件傳入內存映射區,然后輸出至屏幕 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> int main() {// 打開一個文件int fd = open("1.txt", O_RDWR);int len = lseek(fd, 0, SEEK_END); // 獲得文件大小// 創建內存映射區void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if(ptr == MAP_FAILED){perror("mmap error");exit(1);}printf("%s", (char*)ptr); // 打印內容到屏幕munmap(ptr, len); // 關閉緩存區close(fd); // 關閉文件return 0; }二、利用 mmap 進行有血緣關系進程間通信
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <sys/wait.h> int main() {int fd = open("1.txt",O_RDWR); // 打開一個文件int len = lseek(fd, 0, SEEK_END);// 建立映射區void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if(ptr == MAP_FAILED){perror("mmap error"); // 如果創建失敗,輸出錯誤提示exit(1);} pid_t pid = fork(); // 創建子進程if(pid == -1){perror("fork error"); // 如果創建失敗,輸出錯誤提示exit(1); }if(pid > 0) // 父子都可以通過 ptr 進行通信{ strcpy((char*)ptr,"你是我兒子么?"); // 父進程寫數據wait(NULL); // 回收子進程}else if(pid == 0) {sleep(1); // 保證父進程能先寫數據printf("%s\n",(char*)ptr); // 子進程讀數據至屏幕 } munmap(ptr, len); // 釋放映射區 close(fd) // 關閉文件return 0; }三、利用 mmap 進行無血緣關系進程間通信
注意:不能使用匿名映射方式,只能借助磁盤文件(以 hello 為例)創建映射區。
偽代碼:a 進程(a.c)與 b 進程(b.c)
a.c :
b.c:
int fd1 = open(“hello”……..); void * ptr 1= mmap(….. fd1,0); 對映射區進行讀寫操作總結
以上是生活随笔為你收集整理的Linux学习之系统编程篇:mmap练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习之系统编程篇:mmap 内
- 下一篇: Linux学习之系统编程篇:创建匿名映射