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

来源:互联网 发布:游戏代练app源码 编辑:程序博客网 时间:2024/06/11 23:22

                             进程间通信-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 fileZXangxiang
   
有了以上的基础,使用mmap进行进程间的通信就简单了。

    


CCPP Blog 目录


1 0