linux系统编程:进程间通信-mmap

                             进程间通信-mmap

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
  

mmap本质是把内存与硬盘上的文件同步。某块内存中的内容会同步到硬盘文件上,即把文件映射到内存。故通过对同一文件的读写达到进程间的通信。

參数解释:

addr:指定对哪儿块内存实行映射。

NULL表示由系统分配。

length:addr的长度

prot:内存块儿的属性:读、写、运行。

flag:内存块儿的内容是否同步到文件里。MAP_SHARED同步,MAP_PRIVATE不同步。

fd:文件描写叙述符

offset:文件映射的起始位置

成功。返回映射的内存地址;失败返回void *(-1)。

mmap.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

void sys_err(char *s)
{
	perror(s);
	exit(1);
}
int main(int argc, char **argv)
{
	if(argc < 2)
	{
		fprintf(stdin, "usage:./a.out filename");
		return 1;
	}

	int fd;
	fd = open(argv[1], O_RDWR);
	if(fd < 0) sys_err("open");
	off_t len;
	len = lseek(fd, 0, SEEK_END);

	void *mem;
	mem = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
	if(mem == MAP_FAILED)  //#define MAP_FAILED ((void *) -1)
		sys_err("mmap");
	/*
	if((void*)-1 == mem)
		sys_err("mmap");
	*/

	close(fd);
	
	printf("%s\n", mem);
	*(char*)mem = 'Z';
	*(char*)(mem + 1) = 'X';
	
	if(-1 == munmap(mem, len))
		sys_err("munmap");

	return 0;
}


文件file:zhangxiang

$ gcc mmap.c
$ ./a.out file
$ cat file
ZXangxiang
   
有了以上的基础,使用mmap进行进程间的通信就简单了。

    


CCPP Blog 文件夹


posted @ 2016-03-25 20:00  zfyouxi  阅读(660)  评论(0编辑  收藏  举报