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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

存储映射I/O(一)

發(fā)布時間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 存储映射I/O(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、存儲映射I/O

存儲映射I/O使一個磁盤文件與存儲空間中的一個緩沖區(qū)映射,于是當(dāng)從緩沖區(qū)中取數(shù)據(jù),就相當(dāng)于讀文件中的相應(yīng)字節(jié)。于此類似,將數(shù)據(jù)存入緩沖區(qū),則相應(yīng)的字節(jié)就自動寫入文件,這樣,就可在不不適用read和write函數(shù)的情況下,使用地址(指針)完成I/O操作。

使用這種方法,首先應(yīng)通知內(nèi)核,將一個指定文件映射到存儲區(qū)域中,這個映射工作可以通過mmap函數(shù)來實現(xiàn)。

?

二、主要應(yīng)用函數(shù)

1. mmap函數(shù)原型:

#include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);返回值:若成功,返回映射區(qū)的起始位置;若出錯,返回MAP_FALLED

參數(shù):

? ? ? ? addr:? ? 建立映射區(qū)的首地址,由于Linux內(nèi)核指定,使用時,直接傳遞NULL

? ? ? ? lengrh: 欲創(chuàng)建映射區(qū)的大小

? ? ? ? prot:? ? ?映射區(qū)權(quán)限PROT_READ、PROT_WRITE、PROT_READ |? PROT_WRITE

? ? ? ? flag:? ? ?標(biāo)志位參數(shù)(常用于設(shè)定更新物理區(qū)、設(shè)置共享、創(chuàng)建匿名映射區(qū))

? ? ? ? ? ? ? ? ? ? ? ?MAP_SHARED:會將映射區(qū)所做的操作反映到物理設(shè)備(磁盤)上。

? ? ? ? ? ? ? ? ? ? ? ? MAP_PRIVATE:映射區(qū)所做的修改不會反映到物理設(shè)備。

? ? ? ? fd:? ? ? ? ?用來建立映射區(qū)的文件描述符。

? ? ? offset:? ? ?映射文件的偏移量(4k的整數(shù)倍)

?

使用mmap時務(wù)必注意以下事項:

  • 創(chuàng)建映射區(qū)的過程,隱含著一次對映射文件的讀操作。
  • 當(dāng)MAP_SHARED時,要求:映射區(qū)的權(quán)限應(yīng) <= 文件打開的權(quán)限(處于對映射區(qū)的保護(hù))。而MAP_PRIVATE則無所謂,因為mmap中的權(quán)限是對內(nèi)存的限制。
  • 映射區(qū)的釋放與文件關(guān)閉無關(guān),只要映射區(qū)建立成功,文件可以立即關(guān)閉。
  • 特別注意。當(dāng)映射區(qū)文件大下為0時, 不能創(chuàng)建映射區(qū)。所以:用于映射區(qū)的文件必須要有實際大小!!mmap使用時常常會出現(xiàn)總線錯誤,通常是由于共享文件存儲空間大小引起的。(文件的大小不能小于映射區(qū)的大小)
  • mummap傳入地址一定是mmap的返回地址。堅決杜絕指針++操作。
  • 文件偏移量必須為4k的整數(shù)倍
  • mmap創(chuàng)建映射區(qū)錯概率非常高,一定要檢查返回值,確保映射區(qū)建立成功在進(jìn)行后續(xù)操作。

?

示意圖:

?

三、程序清單

1. 測試代碼:

#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/wait.h>int main() {int fd1, fd2;pid_t pid;char buf[1024];char *str = "----------test for shared fd in parent child process-----";pid = fork();if(pid < 0) {perror("fork error");exit(1);} else if(pid == 0) {fd1 = open("test.txt", O_RDWR);if(fd1 < 0) {perror("open error");exit(1);}write(fd1, str, strlen(str));printf("child wrote over....");} else {fd2 = open("test.txt", O_RDWR);if(fd2 < 0) {perror("open error");exit(1);}sleep(1);int len = read(fd2, buf, sizeof(buf));write(STDOUT_FILENO, buf, len);wait(NULL);}return 0; }

輸出結(jié)果:

?

2 測試代碼:

#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/mman.h>int main() {int len, ret;char *p = NULL;int fd = open("mytest.txt", O_CREAT | O_RDWR, 0644);if(fd < 0) {perror("open error: ");exit(1);}len = ftruncate(fd, 4);p = mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if(p == MAP_FAILED) {perror("mmap error:");exit(1);}strcpy(p, "abc"); //寫數(shù)據(jù)ret = munmap(p, 4);if(ret == -1) {perror("mmap error:");exit(1);}close(fd);return 0; }

輸出結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的存储映射I/O(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。