system V 共享内存 shmget shmctl 用法解释

来源:互联网 发布:mac 美服lol下载教程 编辑:程序博客网 时间:2024/06/03 10:29

基本用法看man文档

1. shmget,shmflg指定IPC_EXCL位

          A.    如果key对应的共享内存已经存在,则返回-1,并且置errno为EEXIST错误;此时需要重新shmget一下并且shmflg不置IPC_EXCL位

          B.    否则如果key对应的共享内存不存在: 

                   如果size大于已存在共享内存容量,则返回-1并置errno为EINVAL,此时需要删除旧共享内存并重新申请(申请时序先shmget 一下,参数size置1, 目的是获取旧共享内存的shmid,共shmctl删除使用)

                   如果size小于等于共享内存容量,分配成功(如果在这一步分配失败,则可通过error值确定原因)

  2. shmctl。

              shmctl删除共享内存时首先要获取共享内存id,方法见上。

测试:

1.  a进程创建一块大小为8的共享内存,并进入死循环(目的是关联该共享内存,使下面的nattch不为0)

        # ./a

        # ipcs -m
             ----- Shared Memory Segments --------
             key                       shmid        owner      perms      bytes     nattch    status     
             0x000214bc    1933313        root           666           8              1      

2.   c进程key与a进程相同,创建大小为1024共享内存,发现已存在共享内存(a进程创建)容量太小,则删除旧共享内存,并重新创建。

       #  ./c
       #  ipcs -m
            ------ Shared Memory Segments --------
            key                       shmid        owner      perms      bytes     nattch     status      
            0x00000000    1933313       root           666            8              1          dest         
            0x000214bc     1966082      root            232        1024            0                 

      可以看出a进程创建共享内存所用key值已经从0x000214bc 变成0x00000000,并且status变成dest状态,这是由于c进程的shmctl在删除旧共享内存时,内核发现该共享内存的nattch为1(也就是有进程关联在该共享内存上,此处为a进程,因为死循环),内核就会置key为IPC_PRIVATE并置status为dest,这就保证该共享内存成为唯一的,dest状态会保证在关联进程(此处为a进程)终止时,该共享内存会被内核删除回收,而c进程创建的共享内存的key值依然是0x000214bc 。

3. key值为IPC_PRIVATE

          IPC_PRIVATE会保证创建唯一的共享内存,多个进程都可以用IPC_PRIVATE创建自己特有的共享内存。

   测试如下图

       # ipcs -m
          ------ Shared Memory Segments --------
          key                          shmid      owner      perms      bytes      nattch     status                        
         0x00000000        1933313      root           666           8              1          dest         
         0x000214bc        1966082      root           232        1024          0                       
         0x00000000        1998851      root           232           1             0                       
         0x00000000        2031620      root           232           1             0                       
         0x00000000        2064389      root           232           1             0                 

原创粉丝点击