zoukankan      html  css  js  c++  java
  • 进程通信之共享内存

    共享内存
        首先应该清楚,共享内存是进程共享数据最快的一种方法,同样这也表明了它的不安全性因素。
    一、获得创建共享内存
        #include <sys/ipc.h>
        #include <sys/shm.h>
        int shmget(key_t shmid,size_t size,int shmflg);
        key 0(IPC_PRIVATE):会建立新共享内存对象,大于0的32位整数:视参数shmflg来确定操作。通常要求此值来源于ftok返回的IPC键值
        size 大于0的整数:新建的共享内存大小,以字节为单位 ;只获取共享内存时指定为0
        shmflg 0:取共享内存标识符,若不存在则函数会报错
    IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
    IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错
        此函数得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。
    二、映射共享内存
        #include <sys/types.h>
        #include <sys/shm.h>
        char *shmat(int shmid,char *shmaddr,int shmflg);
        at表示attach。由此可见,此函数的作用为将标示符为shmid的共享内存映射到当前运行的进程中。
    换句话说就是进程连接共享内存。返回的是映射的共享内存的地址。
        shmaddr 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。
        shmflg SHM_RDONLY:为只读模式,其他为读写模式 。
    三、断开共享内存
        #include <sys/types.h>
        #include <sys/shm.h>
        int shmdt(char *shmaddr);
        shmaddr为连接共享内存的起始地址,对比shmat里参数即知。返回0为成功。
        注意此函数只是进程断开与共享内存的连接,而不是删除。当然,若是进程结束,则自动断开连接。

  • 相关阅读:
    Django(app的概念、ORM介绍及编码错误问题)
    Django(完整的登录示例、render字符串替换和redirect跳转)
    Construct Binary Tree from Preorder and Inorder Traversal
    Single Number II
    Single Number
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Binary Tree Zigzag Level Order Traversal
    Recover Binary Search Tree
    Add Binary
  • 原文地址:https://www.cnblogs.com/pangblog/p/3367581.html
Copyright © 2011-2022 走看看