IPC——mmap

限于喜欢 提交于 2019-11-27 02:29:28

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!