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进行映射