zoukankan      html  css  js  c++  java
  • 建立共享内存和操作共享内存几个函数的用法

    建立共享内存和操作共享内存几个函数的用法
    在创建共享内存和操作共享内存的时候被下面这些函数的参数弄糊涂了,
    遂查找资料写下各个函数的说明。

    所需头文件
    #include<sys/ipc.h>
    #include<sys/shm.h>
    函数
    (1)shmget(key_t key,int size,int shmflag)
    函数说明
    shmget()用来取得参数key所关联的共享内存识别代号,如果key是IPC_PRIVATE则会建立新的共享内存,
    其大小由size决定,如果key不为IPC_PRIVATE,也不是已建立的IPC key,那么系统回视参数
    shmflag是否有IPC_CREAT位,来确定以IPC key为参数的key的
    共享内存。如果参数shmflag包含了IPC_CRATE 和IPC_EXCL位,
    而无法依参数key来建立共享内存,则表示该共享内存已存在。
    错误代码:
    EINVAL  参数size小于SHMMIN或大于SHMMAX
    EEXIST   欲建立key所致新的共享内存,但已存在
    EIDRM    参数key所致的共享内存已删除
    ENOENT   参数key所指的共享内存不存在,参数shmflag也没设置         IPC_CREAT位
    ENOMEM  核心内存不足
    ENOSPC   已超过系统允许可建立的共享内存最大值


    (2)int shmdt(const void *shmaddr)
    函数说明:
    shmdt()用来将先前用shmat()连接好的共享内存脱离目前的进程,
    参数shmaddr为先前shmat()返回的共享内存地址

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

    shmctl()提供了几种方式来控制共享内存操作,其中cmd有下列几种数值:
    IPC_STAT 把共享内存的shmid_ds结构数据复制到引数buf
    IPC_SET  将参数buf所指的shmid_ds结构中的shm_perm.uid、shm_perm.gid 
                   shm_perm.mode复制到共享内存的shmid_ds结构中
    IPC_RMID 删除共享内存和其数据结构
    SHM_LOCK  不让此共享内存置换到swap
    SHM_UNLOCK  允许此共享内存置换到swap
    SHM_LOCK 和SHM_UNLOCK为linux特有,且唯有超级用户允许使用

    shmid_ds 的结构定义如下
    struct shmid_ds
     {
       struct ipc_perm  shm_perm;
       int     shm_segsz;//共享内存大小,以字节计算
       time_t  shm_atime;//最后一次attach此共享内存的时间
       time_t  shm_dtime;//最后一次detach此共享内存的时间
       time_t  shm_ctime;//最后一次更改此共享内存的时间
       unsigned short shm_cpid;//建立此共享内存的进程识别码
       unsigned short shm_lpid;//最后一次操作此共享内存的进程识别码
        short shm_nattch;
        unsigned short shm_npages;
        unsigned long *shm_pages;
        struct shm_desc *attaches;
      };
    注意(1)要理解各个函数参数有哪些
        (2)这些参数的作用是什么
        (3)这些会帮助理解函数的使用方法(工作机理)
    创建共享内存和操作共享内存实例

    1. #include<unistd.h>
    2. #include<sys/ipc.h>
    3. #include<sys/shm.h>
    4. #include<stdio.h>
    5. #include<string.h>
    6.  #define KEY  1234
    7.  #define SIZE 1024

    8. int main()
    9. {
    10.  
    11.  int shmid;
    12.  char *shmaddr;
    13.  struct shmid_ds buf;
    14. //建立共享内存
    15.  shmid = shmget(KEY,SIZE,IPC_CREAT | 0600);
    16.   
    17.   if( fork() == 0 )
    18.     {
    19.      shmaddr =(char *)shmat(shmid,NULL,0);
    20.       strcpy(shmaddr,"hi! i am child process! ");
    21.       shmdt(shmaddr);
    22.       return 0;
    23.     }
    24.   else
    25.     {
    26.      sleep(3);
    27.      shmctl(shmid,IPC_STAT,&buf);
    28.       printf("shm_segsz = %d bytes ",buf.shm_segsz);
    29.   printf("shm_cpid = %d ",buf.shm_cpid);
    30.   printf("shm_lpid = %d ",buf.shm_lpid);
    31.   shmaddr =(char *)shmat(shmid,NULL,0);
    32.   printf("%s",shmaddr);
    33.   shmdt(shmaddr);
    34.    shmctl(shmid,IPC_RMID,NULL);
    35.     }
    36.  return 0;
    37. }

  • 相关阅读:
    Delphi单元文件之-防止程序重复执行
    cxGrid使用汇总2
    Delphi数组复制
    cxGrid使用汇总1
    Delphi XE5 android 获取网络状态
    xe5 android sample 中的 SimpleList 是怎样绑定的
    XE5 Android 开发数据访问手机端 解决乱码的办法
    设计模式之代理模式
    设计模式之单例模式及原型模式
    设计模式之工厂模式
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3206262.html
Copyright © 2011-2022 走看看