黑馬《linux系統程式設計》學習筆記(從41到45)
阿新 • • 發佈:2019-01-01
四十一. 使用mmap讀取磁碟檔案內容
這裡是mmap.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <sys/mman.h> #include <fcntl.h> int main(int argc, const char* argv[]) { int fd = open("english.txt", O_RDWR); if(fd == -1) { perror("open error"); exit(1); } // get file length // len > 0 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("buf = %s\n", (char*)ptr); // ptr++; munmap(ptr, len); char buf[4096]; return 0; }
四十二. mmap注意事項
四十三. 使用mmap進行有血緣關係的程序間通訊
mmap_parent_child.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <string.h> #include <sys/mman.h> #include <fcntl.h> int main(int argc, const char* argv[]) { int fd = open("english.txt", O_RDWR); if(fd == -1) { perror("open error"); exit(1); } // get file length // len > 0 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); } close(fd); // 建立子程序 pid_t pid = fork(); if(pid== -1) { perror("fork error"); exit(1); } if(pid>0) { //寫資料 strcpy((char*)ptr,"你是我的兒子嗎?"); //回收 wait(NULL); } else if(pid ==0) { //讀資料 printf("%s\n",(char*)ptr); } // ptr++; int ret = munmap(ptr, len); if(ret == -1) { perror("munmap error"); exit(1); } return 0; }
mmap的優勢,在於資料是在記憶體,而非在磁盤裡進行處理的
四十四. 建立匿名對映區
接下來,是anon_mmap.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <string.h> #include <sys/mman.h> #include <fcntl.h> int main(int argc, const char* argv[]) { //建立匿名記憶體對映區 int len = 4096; //注意這裡的引數的變化, void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if(ptr == MAP_FAILED) { perror("mmap error"); exit(1); } close(fd); // 建立子程序 pid_t pid = fork(); if(pid== -1) { perror("fork error"); exit(1); } if(pid>0) { //寫資料 strcpy((char*)ptr,"你是我的兒子嗎?"); //回收 wait(NULL); } else if(pid ==0) { //讀資料 printf("%s\n",(char*)ptr); } // ptr++; int ret = munmap(ptr, len); if(ret == -1) { perror("munmap error"); exit(1); } return 0; }
相比較於前面,主要是加了MAP_ANON, 以及fd的位置用-1.
相當於父程序在記憶體中寫了一句話,子程序在記憶體裡讀了出來。
四十五. mmap沒有血緣關係的程序間通訊思路