共享内存

共享内存是被多个进程共享的一部分物理内存;

写入共享内存后,数据不会消失,可以一直读取;

再次向共享内存中写入,会覆盖原来的数据,即每次写数据都是从相同的位置上写(从shmat函数返回的地址开始写)

多进程想要进程数据通信,就得把这块共享内存映射到自己的虚拟地址空间,其在虚拟地址空间的位置

 

 

 共享内存是一个共享资源,本身不提供同步机制,可通过信号量进行同步;

是最高效的IPC机制;

 

共享内存的属性:

  

 

 共享内存的使用步骤:

  1. 调用shmget函数创建共享内存

  2. 调用shmat函数将创建的共享内存映射到进程的虚拟内存空间中

 

共享内存的创建:

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

  成功返回内核中共享内存的标识id,失败-1

  参数:

    key:用户空间的唯一标识key

    size:共享内存的大小

    shmflg:IPC_CREAT、IPC_EXCL等

 

共享内存的控制:

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

  成功返回0,失败-1

  参数:

    shmid:共享内存id

    buf:共享内存属性指针

    cmd:

      IPC_STAT     获取共享内存属性

      IPC_SET      设置共享内存属性

      IPC_RMID    删除共享内存

      IPC_LOCK  锁定共享内存页面(映射的物理内存不和外存进行换入换出操作)

      IPC_UNLOCK     解除锁定共享内存页面 

  

共享内存的映射和解除映射:

  void* shmat(int shmid,char *shmaddr,int shmflg)

  成功返回共享内存映射到进程虚拟内存地址空间中的地址,失败-1

  int shmdt(char *shmaddr)

  失败-1

  参数:

    shmid:共享内存id

    shmaddr:映射到进程虚拟内存空间的地址(可以人为指定),但建议设置为0,表示由系统分配

    shmflg:若shmaddr设置为0,shmflg也设置为0

  子进程不继承父进程创建的共享内存,是共享的。子进程继承父进程映射的地址。

 

posted @ 2023-03-06 20:43  踏浪而来的人  阅读(291)  评论(0编辑  收藏  举报