共享内存操作

C共享内存

  1. ftok —>文件到key,保证唯一性,存放在keys中,并且通过下面的方法将对应的字符串设置到进程的环境变量中,
    以便fork出来的进程的可以访问这些环境变量:

    1
    i = setenv(env_strings[apptype],envstr,1);
  2. 获取shm_id

    1
    shm_id = shmget (keys[apptype],sizeof(struct mem_blk),IPC_CREAT| IPC_EXCL|0x1ff);
  3. 更改shm_id相关的属性

    1
    2
    3
    shmctl(shm_id,IPC_STAT,&shmbuf);
    shmbuf.shm_perm.mode &= SHM_R| SHM_W;
    shmctl(shm_id,IPC_SET,&shmbuf);
  4. 获取相应的共享内存,并且初始化共享内存为0

    1
    pshm = (int8_t*)shmat(shm_id,NULL,0);
  5. 共享内存的删除:

    1
    shmctl(shm_id, IPC_RMID, 0)
  6. (在其他进程子进程)连接共享内存:

    1
    2
    3
    envstr = getenv(env_strings[apptype]);
    shm_id = atoi(envstr);
    pshm = ( int8_t*)shmat(shm_id,NULL,0);
  7. 共享内存的读写:
    通过6得到的pshm共享内存指针就可以往该共享内存块上进行读写

  8. 共享内存操作命令:ipcs、ipcrm

    1. ipcs -m 显示共享内存:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      ------ Shared Memory Segments --------  
      key shmid owner perms bytes nattch status
      0x740180a7 2686976 root 600 4 0
      0x740a800c 3642337 root 600 4 0
      0x00000000 5644578 nobody 600 16777216 129 dest
      0x740aa00b 3609571 root 600 4 0
      0x00000000 5677348 nobody 600 16777216 257 dest
      0x00000000 5660117 nobody 600 16777216 257 dest
      0x00000bde 5642887 root 666 63120208 1

    字段|说明
    —-|—-
    key |是用来唯一标识这段共享内存的唯一标示;
    shmid|是shmget返回的共享内存id;
    owner|创建共享内存的用户
    perms|读写权限
    Bytes|标示key这段共享内存大小
    nattach|表示attch到这段共享内存的数量

    1. ipcrm -m shmid removes the shared memory segment identified by shmid after the last detach is performed.
坚持原创技术分享,您的支持奖鼓励我继续创作!