日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习之系统编程篇:mmap练习

發布時間:2024/9/30 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 :

int fd = open(“hello” ……..); void * ptr = mmap(.. fd,0); 對映射區進行讀寫操作

b.c:

int fd1 = open(“hello”……..); void * ptr 1= mmap(.. fd1,0); 對映射區進行讀寫操作

總結

以上是生活随笔為你收集整理的Linux学习之系统编程篇:mmap练习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。