1. 程式人生 > >程序間通訊之記憶體對映(mmap記憶體對映)

程序間通訊之記憶體對映(mmap記憶體對映)

讀資料端程序

//mmanp_r.c
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<unistd.h>
#include<sys/stat.h>
#define len 0x1000
int main()
{
    int fd;
    fd=open("cmmap",O_RDWR);

    char *addr =  mmap(NULL,len,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
    if(MAP_FAILED == addr)
    {
        exit(1);
    }
    close(fd);
    while(1)
    {
        printf("%s\n",addr);
        sleep(1);
    }
    close(fd);
    munmap(addr,len);
   return 0;
}

寫資料端程序

//mmap_w.c
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<unistd.h>
#include<sys/stat.h>
#define len 4096
int main()
{
    int fd;
    if(access("cmmap",F_OK))
    {
        fd=open("cmmap",O_RDWR|O_CREAT|O_TRUNC,0777);
    }
    else
    {
         fd=open("cmmap",O_RDWR);
    }
    lseek(fd,len-1,SEEK_SET);
    write(fd,"\0",1);

    char *addr =  mmap(NULL,len,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
   if(MAP_FAILED == addr)
    {
        exit(1);
    }
   int i =0;
    while(1)
    {
        sprintf(addr,"hello world,%d",i++);
        sleep(1);
        printf("hello world");
    }
    close(fd);
    munmap(addr,len);
   return 0;
}

mmap記憶體對映顧名思義是通過將磁碟檔案以shared的形式對映到記憶體中,然後通過向該段記憶體寫入資料和讀取資料來實現程序間的通訊,mmap函式的定義如下mmap(void, off_t offset); addr是要地址,len是對映的檔案長度,port是對映對分配的pages的操作許可權,flags是描述對映物件的型別。mmap相比於write和read對檔案操作要快的多,檔案的讀寫都是先到page cache中儲存,然後再緩衝到磁碟檔案,mmap直接操作記憶體page頁。不需要頻繁的讀取檔案。所以要快的多。

注意。mmap對映區域大小必須是物理頁大小(page_size)的整倍數(32位系統中通常是4k位元組),並且使用完以後應當使用munmap釋放對映段,否則將會造成記憶體洩漏。mmap函式的呼叫失敗的情況很多。比如內部不夠時,檔案讀寫許可權與對映引數不匹配等,呼叫的時候應當加以注意。

原創。如有錯漏歡迎指出