zoukankan      html  css  js  c++  java
  • 共享内存

    from:unix高级环境编程

    unix/linux中共享内存是最高效的ipc方式。

    有几种使用方式:

    1)mmap /dev/zero设备:

    fd = open("/dev/zero", O_RDWR);

    area = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    close(fd);

    增加MAP_SHARED能够使子进程共享,但不相关进程不能共享。


    2)匿名mmap:

    4.3+BSD開始提供,须要MAP_ANON參数,效果和/dev/zero映射一样。

    mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)


    3)shm*系列函数,不同于mmap,能够在不相关进程中共享内存。

    int shmget(key_t key, int size, int flag);返回共享内存ID(失败返回-1)。

    shmctl函数对共享存储段运行多种操作:

    int shmctl(int shmid, int cmd, struct shmid_ds* buf);

    命令有:IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK

    一旦创建一个共享内存段,进程间就能够调用shmat(at是attach的意思)将其连接到自己的地址空间中。

    void* shmat(int shmid, void* addr, int flag);

    addr为0,则此段连接到内核选择的第一个可用地址;非0,则连接到addr提供的地址,设置SHM_RND的标志能够对地址做对齐操作。

    一般选择addr = 0。flag中还提供SHM_RDONLY,以仅仅读方式连接。

    对共享内存操作结束后,调用shmdt(dt是detach)进行detach。

    int shmdt(void* addr);

    创建共享内存的那个进程最后还要使用shmctl删除共享内存段(IPC_RMID)。


    从资料来看,mmap起源比較早了。

  • 相关阅读:
    IOS系统input输入框为readonly时, 隐藏键盘上的上下箭头
    vue2.0做移动端开发用到的相关插件和经验总结
    安卓手机输入法挡住输入框的问题
    .NET返回上一页
    多线程编程
    多线程采集
    Delphi Base64编码_解码及ZLib压缩_解压(转)
    MySQL教程97-MySQL创建索引
    MySQL教程96-MySQL索引类型
    MySQL教程95-MySQL索引 INDEX
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4296041.html
Copyright © 2011-2022 走看看