青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-167  評論-8  文章-0  trackbacks-0
UNIX網絡編程第二卷進程間通信對mmap函數進行了說明。該函數主要用途有三個:
1、將一個普通文件映射到內存中,通常在需要對文件進行頻繁讀寫時使用,這樣用內存讀寫取代I/O讀寫,以獲得較高的性能;
2、將特殊文件進行匿名內存映射,可以為關聯進程提供共享內存空間;
3、為無關聯的進程提供共享內存空間,一般也是將一個普通文件映射到內存中。
頭文件:
    #include <sys/mman.h>
函數:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
參數start:指向欲映射的內存起始地址,通常設為 NULL,代表讓系統自動選定地址,映射成功后返回該地址。
參數length:代表將文件中多大的部分映射到內存。
參數prot:映射區域的保護方式??梢詾橐韵聨追N方式的組合:
PROT_EXEC 映射區域可被執行
PROT_READ 映射區域可被讀取
PROT_WRITE 映射區域可被寫入
PROT_NONE 映射區域不能存取
參數flags:影響映射區域的各種特性。在調用mmap()時必須要指定MAP_SHARED 或MAP_PRIVATE。
MAP_FIXED 如果參數start所指的地址無法成功建立映射時,則放棄映射,不對地址做修正。通常不鼓勵用此旗標。
MAP_SHARED對映射區域的寫入數據會復制回文件內,而且允許其他映射該文件的進程共享。
MAP_PRIVATE 對映射區域的寫入操作會產生一個映射文件的復制,即私人的“寫入時復制”(copy on write)對此區域作的任何修改都不會寫回原來的文件內容。
MAP_ANONYMOUS建立匿名映射。此時會忽略參數fd,不涉及文件,而且映射區域無法和其他進程共享。
MAP_DENYWRITE只允許對映射區域的寫入操作,其他對文件直接寫入的操作將會被拒絕。
MAP_LOCKED 將映射區域鎖定住,這表示該區域不會被置換(swap)。
參數fd:要映射到內存中的文件描述符。如果使用匿名內存映射時,即flags中設置了MAP_ANONYMOUS,fd設為-1。有些系統不支持匿名內存映射,則可以使用fopen打開/dev/zero文件,然后對該文件進行映射,可以同樣達到匿名內存映射的效果。
參數offset:文件映射的偏移量,通常設置為0,代表從文件最前方開始對應,offset必須是分頁大小的整數倍。
返回值:
若映射成功則返回映射區的內存起始地址,否則返回MAP_FAILED(-1),錯誤原因存于errno 中。
錯誤代碼:
EBADF 參數fd 不是有效的文件描述詞
EACCES 存取權限有誤。如果是MAP_PRIVATE 情況下文件必須可讀,使用MAP_SHARED則要有PROT_WRITE以及該文件要能寫入。
EINVAL 參數start、length 或offset有一個不合法。
EAGAIN 文件被鎖住,或是有太多內存被鎖住。
ENOMEM 內存不足。
系統調用mmap()用于共享內存的兩種方式:
(1)使用普通文件提供的內存映射:
適用于任何進程之間。此時,需要打開或創建一個文件,然后再調用mmap()
典型調用代碼如下:
fd=open(name, flag, mode); if(fd<0) ...
ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0);
通過mmap()實現共享內存的通信方式有許多特點和要注意的地方,可以參看UNIX網絡編程第二卷。
(2)使用特殊文件提供匿名內存映射:
適用于具有親緣關系的進程之間。由于父子進程特殊的親緣關系,在父進程中先調用mmap(),然后調用 fork()。那么在調用fork()之后,子進程繼承父進程匿名映射后的地址空間,同樣也繼承mmap()返回的地址,這樣,父子進程就可以通過映射區域進行通信了。注意,這里不是一般的繼承關系。一般來說,子進程單獨維護從父進程繼承下來的一些變量。而mmap()返回的地址,卻由父子進程共同維護。對于具有親緣關系的進程實現共享內存最好的方式應該是采用匿名內存映射的方式。此時,不必指定具體的文件,只要設置相應的標志即可。 
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
//定義存放記錄的結構體
typedef struct
{
    int index; //編號
    char text[10]; //內容
} RECORD;
#define SIZE (50)
#define EDIT_INDEX (10)
int main(void)
{
    RECORD record, *p_mapped_memory_addr;
    int i, fd;
    FILE *fp;
    //創建文件并寫入測試數據
    fp = fopen("records.dat", "w+");
    for (i = 0; i < SIZE; i++)
    {
        record.index = i;
        sprintf(record.text, "No.%d", i);
        fwrite(&record, sizeof(record), 1, fp);//因為字節序對齊,在32位機上,sizeof(record)=16,并不是14。
    }
    fclose(fp);
    printf("Ok, write %d records to the file: records.dat .\n", SIZE);
    //將第一30條記錄編號修改為300,并相應地修改其內容。
    //采用傳統方式
    fp = fopen("records.dat", "r+");
    fseek(fp, EDIT_INDEX * sizeof(record), SEEK_SET);
    fread(&record, sizeof(record), 1, fp);
    record.index = EDIT_INDEX*10;
    sprintf(record.text, "No.%d", record.index);
    fseek(fp, EDIT_INDEX * sizeof(record), SEEK_SET);
    fwrite(&record, sizeof(record), 1, fp);
    fclose(fp);
    printf("Ok, edit the file of records.dat using traditional method.\n");
    /////////////////////////////////////////
    //同樣的修改,這次使用內存映射方式。
    //將記錄映射到內存中
    fd = open("records.dat", O_RDWR);
    p_mapped_memory_addr = (RECORD *)mmap(0, SIZE * sizeof(record), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    //修改數據
    p_mapped_memory_addr[EDIT_INDEX].index = EDIT_INDEX*10;
    sprintf(p_mapped_memory_addr[EDIT_INDEX].text, "No.%d",
            p_mapped_memory_addr[EDIT_INDEX].index);
    /* Synchronize the region starting at ADDR and extending LEN bytes with the
     file it maps. Filesystem operations on a file being mapped are
     unpredictable before this is done. Flags are from the MS_* set.
     This function is a cancellation point and therefore not marked with
     __THROW. extern int msync (void *__addr, size_t __len, int __flags);
     */
    //將修改寫回映射文件中(采用異步寫方式)
    msync((void *)p_mapped_memory_addr, SIZE * sizeof(record), MS_ASYNC);
    /* Deallocate any mapping for the region starting at ADDR and extending LEN
     bytes. Returns 0 if successful, -1 for errors (and sets errno). 
     extern int munmap (void *__addr, size_t __len) __THROW;
     */
    //釋放內存段
    munmap((void *)p_mapped_memory_addr, SIZE * sizeof(record));
    printf("Ok, edit the file of records.dat using mmap method.\n");
    //關閉文件
    close(fd);
    
    return 0;
}
posted on 2012-01-14 17:01 老馬驛站 閱讀(3507) 評論(0)  編輯 收藏 引用 所屬分類: c++ 、linux
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一级视频免费在线观看| 免费在线亚洲欧美| 99精品99| 99在线热播精品免费99热| 欧美成人久久| 国产伦精品一区二区三区高清版| 国产精品伊人日日| 欧美亚洲视频在线观看| 欧美专区在线观看一区| 欧美大成色www永久网站婷| 亚洲电影免费在线| 一区二区三区免费观看| 欧美在线一二三区| 亚洲欧洲视频在线| 91久久久精品| 亚洲欧美激情视频在线观看一区二区三区| 久久精品国产亚洲精品 | 欧美不卡视频一区| 99视频精品| 欧美大片国产精品| 一区二区三区产品免费精品久久75 | 久久久久久久高潮| 日韩小视频在线观看| 久久综合九九| 国产精品综合| 欧美国产精品一区| 欧美午夜www高清视频| 伊人久久大香线蕉av超碰演员| 亚洲一区二区三区四区五区黄| 免费的成人av| 亚洲欧美日韩国产一区二区三区| 欧美成人一区二区三区片免费| 一区二区三区日韩精品视频| 欧美一区二区三区免费在线看| 欧美丝袜一区二区| 99精品欧美一区二区三区综合在线| 蜜臀久久99精品久久久画质超高清| 欧美韩国在线| 亚洲国产精品激情在线观看 | 黄色日韩在线| 久久国产婷婷国产香蕉| 欧美成人一区二区三区| 欧美在线视频观看免费网站| 免费视频久久| 久久久综合香蕉尹人综合网| 亚洲婷婷综合久久一本伊一区| 美乳少妇欧美精品| 亚洲乱码国产乱码精品精天堂 | 久久精品99国产精品酒店日本| 欧美不卡在线视频| 久久久亚洲人| 国产精品视频xxxx| 亚洲欧美中文日韩v在线观看| 亚洲香蕉网站| 亚洲图片欧美一区| 欧美一区不卡| 午夜精品久久久久| 欧美日韩国产专区| 亚洲视频一区二区在线观看| 麻豆91精品91久久久的内涵| 久久久久久伊人| 国产免费观看久久| 亚洲主播在线| 亚洲电影自拍| 久久亚洲午夜电影| 亚洲精选在线观看| 蜜桃久久av一区| 欧美不卡三区| 国产精品乱人伦一区二区 | 午夜激情综合网| 国产精品va在线| 这里只有精品在线播放| 很黄很黄激情成人| 久久精品一区二区三区中文字幕| 1024精品一区二区三区| 久久精品国产视频| 亚洲视频999| 国产精品qvod| 亚洲欧美激情诱惑| 久久精品久久99精品久久| 国产精品私房写真福利视频 | 亚洲黄色精品| 国产日产欧产精品推荐色| 另类图片国产| 国产精品视频自拍| 久久成人18免费网站| 蜜桃精品久久久久久久免费影院| 亚洲高清在线观看一区| 欧美激情国产精品| 亚洲视频一区在线观看| 久久国产精品亚洲va麻豆| 一区在线观看| 亚洲一区久久久| 99在线精品免费视频九九视| 欧美日韩一区二区高清| 亚洲欧洲日韩综合二区| 亚洲女人av| 精久久久久久| 欧美日韩国产在线| 性欧美激情精品| 欧美一区二区三区日韩| 国产精品theporn| 久久99伊人| 亚洲人成精品久久久久| 亚洲国产精品成人一区二区| 欧美日韩免费观看一区三区| 亚洲自啪免费| 91久久久久久久久| 久久精品国产精品| 日韩亚洲欧美高清| 激情丁香综合| 国产精品久久久久影院亚瑟| 久久一区二区精品| 亚洲综合99| 亚洲精品久久久一区二区三区| 欧美一区中文字幕| 一本久道久久综合中文字幕| 国内精品一区二区| 欧美伊人久久久久久午夜久久久久 | 久久精品综合网| 在线视频你懂得一区二区三区| 国内精品久久久久久久果冻传媒 | 欧美三级在线视频| 欧美a级理论片| 久久av在线看| 亚洲嫩草精品久久| 99精品国产99久久久久久福利| 欧美88av| 美女主播精品视频一二三四| 欧美在线视频免费观看| 亚洲一区在线观看免费观看电影高清| 欧美婷婷六月丁香综合色| 噜噜噜在线观看免费视频日韩| 亚洲欧美成人精品| 中国成人亚色综合网站| 亚洲老司机av| 欧美亚洲一区| 亚洲砖区区免费| 亚洲性感激情| 亚洲一区二区三区久久| 一区二区日韩| 中国av一区| 亚洲一级电影| 午夜精品福利在线观看| 亚洲一区二区少妇| 亚洲综合色激情五月| 亚洲一区二区在线播放| 中文av一区二区| 亚洲综合二区| 欧美一区二区性| 久久成人国产| 久久久久久久一区二区三区| 久久成人一区二区| 久久久人成影片一区二区三区观看| 欧美在线免费观看| 久久久亚洲影院你懂的| 久久久视频精品| 欧美激情1区2区| 午夜精品影院在线观看| 羞羞色国产精品| 久久手机免费观看| 午夜视频在线观看一区二区三区 | 亚洲人成亚洲人成在线观看| 亚洲精品九九| 狠狠狠色丁香婷婷综合激情| 国内精品久久久久影院薰衣草 | 欧美片网站免费| 久久久激情视频| 久久综合久久美利坚合众国| 免费在线成人av| 欧美特黄一区| 国精品一区二区三区| 亚洲国产专区| 亚洲成人在线免费| 亚洲久久在线| 欧美亚洲在线视频| 欧美激情欧美狂野欧美精品 | 久久综合狠狠| 亚洲精品国产精品国自产观看浪潮 | 久久婷婷激情| 亚洲精品乱码| 亚洲欧美在线磁力| 蜜臀99久久精品久久久久久软件| 欧美日韩免费看| 国内久久婷婷综合| 中文亚洲欧美| 久久亚洲精品视频| 日韩一级黄色av| 老巨人导航500精品| 国产精品久久一区主播| 亚洲黄色影片| 久久丁香综合五月国产三级网站| 欧美激情精品久久久久久变态| 在线亚洲免费| 欧美精品九九| 欧美日韩国产123| 影视先锋久久| 欧美一区二区三区在| 亚洲高清视频一区二区| 亚洲国产精品嫩草影院|