11月3日笔记并发4_共享内存 (key 内存映射 解映射 控制[删除它])

  key_t ftok(const char *pathname, int proj_id);

  int shmget(key_t key, size_t size, int shmflg);

  void *shmat(int shmid, const void *shmaddr, int shmflg);

  int shmdt(const void *shmaddr);

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

                                                                                                                                                           


1.共享内存
    共享是进程间通信的一种方式 多个进程共享一段内存


    由于多个进程共享一段内存,这段内存既是你的,也是我的
    我往这块内存中写数据 实际上就是往你的内存中写数据
    比其他的IPC(pipe FIFO messages)s少了一个copy内存
    的过程 共享内存的效率更高

        "随内核持续性"
    
    实现的方式
        在内核中开辟一段共享内存 其他进程通过映射的方式
        获取这段内存的引用 (指针)

        进程p1可以映射这段内存 同时其他进程p2也可以映射这段内存
        p1往这段内存中写数据 等效于往p2的进程空间中写数据 反之依然

        System V 共享内存
        POSIX 共享内存


2.System V共享内存 API函数 

    System V IPC(msg/shm/sem)操作流程

步骤:        ftok
    -----------> System V IPC对象的Key  ----->创建或打开一个IPC的房间(msg/shm/sem)
    -----> 将这个房间映射到相应的共享内存中去(对于shm)   ---->关闭这个房间

    如果把一个IPC(进程间通信 )设施(msg/shm/sem)比作内核中的一个房间
    那么这个房间一定会有

    一把唯一(只有这个key才能打开,但是key可以复制)的钥匙。

    多个进程如果使用System V 进行 IPC (进程间通信 ),

    那么数据就必须进入到同一个房间中去

    key---> msg消息队列
                shm共享内存
                sem信号量

    (1)ftok 用来创建一个system V IPC对象的Key       

                        key最主要的特征是唯一性

        NAME
            ftok - convert a pathname and a project identifier to a System V IPC key

        SYNOPSIS
            #include <sys/types.h>
            #include <sys/ipc.h>

            key_t ftok(const char *pathname, int proj_id);

           const char *pathname: 一个文件系统的路径名(存在) 一般是工程下的某个路径
           int proj_id: 整数 一般是工程的代号
                返回值
                    成功生成一个唯一的 System v ipc的key(key_t)
                    失败返回-1 同时errno被设置
    
    (2)创建或打开 System V共享内存

        shmget
                shmget - allocates a System V shared memory segment

        SYNOPSIS
            #include <sys/ipc.h>
            #include <sys/shm.h>

            在内核中创建或打开一个System V 共享内存
            int shmget(key_t key, size_t size, int shmflg);

       key_t key:  填入 ftok获取的钥匙 System V 对象的key
      size_t size: 以字节为单位指定共享内存的大小
                            当实际操作为创建一个共享内存的区域的时候
                    必须指定一个不为0的size(必须是Page的整数)
                            如果实际操作为访问一个已经存在的共享内存区时
                    那么size应为0
                
        int shmflg:标志位
                    (1)创建  IPC_CREAT|权限位
                    (2)打开  0
            
                返回值
                    成功返回共享内存区的id,这个id就唯一表示这个共享内存
                    失败返回-1 同时errno被设置
    


    3.映射与解映射
        映射的概念:把内核或设备或为念的一段内存映射到进程的地址空间中区
                             用一个进程的指针区操作这段内存

        NAME
            shmat, shmdt - System V shared memory operations

        SYNOPSIS
            #include <sys/types.h>
            #include <sys/shm.h>
            用来映射一段system V共享内存的
            void *shmat(int shmid, const void *shmaddr, int shmflg);

           int shmid : shm的返回值 共享内存区id
           const void *shmaddr: 指向要映射到进程的那个地址上去
                            一般为NULL 让系统自行分配地址
                int shmflg
                        (1) SHM_RDONLY  只读
                        (2) 0                         读写

                成功 返回映射的首地址
                失败 返回NULL 同时errno被设置


                shmdt解映射一段System V共享内存

            int shmdt(const void *shmaddr);

   const void *shmaddr:要解除映射的那个地址
                返回值
                    成功 返回0
                    失败 返回-1 同时errno被设置


    4.其他操作 删除它

            NAME
                shmctl - System V shared memory control

            SYNOPSIS
                #include <sys/ipc.h>
                #include <sys/shm.h>
                这是一个共享内存的控制函数
                int shmctl(int shmid,  int cmd,  struct shmid_ds *buf);

           int shmid:要控制那个共享内存区  放这个共享的内存ID  shmget的返回值
              int cmd:  操作命令  不同的命令 第三个参数时不一样的
                            IPC_RMID 删除指定的内存区
  struct shmid_ds *buf: 如果cmd ==  IPC_RMID buf为NULL
                
                返回值 
                    成功 返回0
                    失败 返回-1同时errno被设置



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值