1.
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset); int munmap(void *addr, size_t length);
#include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define file "./tmp" #define SIZE 1024 int main() { int fd = -1; int ret = 0; char *ptr = NULL; int pid = -1; if ((fd = open("/dev/zero", O_RDWR)) < 0) { perror("open"); ret = -1; goto __end__; } if ((ptr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { perror("mmap"); ret = -1; goto __end__; } close(fd); fd = -1; if ((pid = fork()) < 0) { perror("fork"); goto __end__; } else if(pid == 0) { sprintf(ptr, "hello world"); } else { sleep(1); printf("%s\n", ptr); } __end__: if (fd == -1) close(fd); if (ptr != NULL || ptr != MAP_FAILED) munmap(ptr, SIZE); return ret; }
(ptr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
参数1:指定分配空间的首地址。传入NULL,表示系统自动分配。 参数2:映射空间的大小 参数3:对空间的操作权限 参数4:是否共享映射 参数5:被映射文件的描述符 参数6:映射区偏移量返回值:系统分配的映射的首地址
注意:
1.使用/dev/zero:/dev/zero可以写入无限数据,但/dev/zero不会在意任何输入数据。 使用/dev/zero的内存映射,分页会初始化为0 2.权限:分页的权限需要小于等于文件的打开权限,并且文件的打开权限必须有读权限 3.映射偏移量:必须为分页的整数倍4.MAP_SHARED:MAP_SHARED会将分页数据的修改同步到文件,从而实现共享IPC。但如果使用MAP_PRIVATE,分页数据会读共享,写复制,无法实现IPC 5.返回值:返回失败为 MAP_FAILED
使用 MAP_ANON 代替 /dev/zero
(ptr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
有两点好处:
1.不需要打开文件 /dev/zero 2.fd 取-1
以上方式只能用于有血缘关系进程通信,
对于无关进程需要打开普通文件,使用MAP_SHARED进行映射