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进行进程间的通信就简单了。