美文网首页
Linux下的共享内存

Linux下的共享内存

作者: 小pb | 来源:发表于2019-11-01 22:25 被阅读0次

    共享内存是最高效的IPC机制,具体概念参考[《《操作系统概念精要》基本概念整理之进程同步篇(二)》],(https://www.jianshu.com/p/45c546d98e1c),这里不再赘述。

    Linux System V共享内存的API定义都在<sys/shm.h>中。包括4个系统调用:shmget,

    shmget 系统调用

        // key表示一个键值,用来标识一段全局唯一的共享内存
        // size 是指定共享内存的大小,单位是字节
        // shmflg的参数和信号量的参数一样
        shmget(key_t key, size_t size, int shmflg);
    

    shmget 成功返回一个正整数,他是共享内存的标识符。shmget 失败返回-1,并且设置errno。
    如果shmget用于创建共享内存,那么这段共享内存都会初始化为0。

    shmat 和shmdt 系统调用

    共享内存被创建/获取之后,他们不能立即访问他,而是需要把它关联到进程的地址空间中,使用完成后,需要把它从进程空间中分离。这项任务分别由以下两个系统调用实现。

      #include <sys/shm.h>
      
      // shm_id是共享内存标识符, shm_addr 参数指定将共享内存关联到进程的那块地址空间,最后的效果还是要收到shmflg参数来决定的。shm_addr 为NULL,由操作系统来映射。
      void* shmat(int  shm_id,  const void* shm_addr, int shmflg);
    
    
      // shmdt 将关联到shm_addr处的共享内存从进程中分离,
      int shmdt(const void * shm_addr);
    

    shmat 成功时返回共享内存被关联到的地址。 失败则会返回 (void*)-1,并设置errno。

    shmdt 成功返回0, 失败返回-1 ,并设置errno。

    shmctl系统调用

    shmctl 系统调用控制共享内存的某些属性。

    int shmctl(int shm_id, int command, struct shmid_ds* buff);
    

    相关文章

      网友评论

          本文标题:Linux下的共享内存

          本文链接:https://www.haomeiwen.com/subject/hgqqbctx.html