进程间通信-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 文件夹

05-02 15:25