码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2015-07-15 21:07:04      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:进程间通信   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 目录


版权声明:本文为博主原创文章,转载,请注明出处。

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

标签:进程间通信   mmap   

原文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/46897151

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!