1. 程式人生 > >共享記憶體mmap函式

共享記憶體mmap函式

/*mmap函式 作用:將檔案或裝置空間對映到共享記憶體區
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
引數
addr:要對映的起始地址。通常指定為NULL,讓核心自動選擇
len:對映到程序地址空間的位元組數
prot:對映區保護方式
	PROT_READ/頁面可讀
	PROT_WRITE/頁面可寫
	PROC_EXEC/頁面可執行
	PROT_NONE/頁面不可訪問
flags:標誌
	MAP_SHARED/變動是共享的
	MAP_PRIVATE/變動是私有的
	MAP_FIXED/準確解釋addr引數
	MAP_ANONYMOUS/建立匿名對映區,不涉及檔案
fd:檔案描述符
offset:從檔案頭開始的偏移量
返回值:成功返回對映到記憶體區的起始地址;失敗返回-1
*/
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define ERR_EXIT(m) \
		do \
		{ \
			perror(m); \
			exit(EXIT_FAILURE); \
		}while(0)

typedef struct stu
{
	char name[4];
	int age;
}STU;

int main(int argc, char *argv[])
{
	if(argc != 2){

		fprintf(stderr,"Usage:%s <file>\n", argv[0]);
		eixt(EXIT_FAILURE);
	}
	int fd;
	fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);
	if(fd == -1)
	{
		ERR_EXIT("open");
	}
	lseek(fd, sizeof(STU)*5-1, SEEK_SET);
	write(fd, "", 1);

	STU *p;
	p = mmap(NULL, sizeof(STU)*5, PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0);
	if( p==NULL)
		ERR_EXIT("mmap");

	char ch = 'a';
	int i;
	for(i=0;i<5;i++)
	{
		//向記憶體中寫入,就像向寫到檔案中一樣
		memcpy((p+i)->name, &ch, 1);//將資料拷貝到記憶體中
		(p+i)->age = 20+i;
		ch++;
	}

	printf("initialize over\n");
	munmap(p, sizeof(STU)*5);//取消建立的對映
	printf("exit\n");
	return 0;
}