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 目录


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值