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. }

  • 相关阅读:
    更改hadoop native库文件后datanode故障
    解决 Unable to load native-hadoop library for your platform
    Windows 下Hadoop的环境变量配置
    在用VMware虚拟机的时候,有时会发现打开虚拟机时提示“该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。配置文件: D:win10x64Windows 10 x64.vmx。”这是由于虚拟机未正常关闭引起的,下面看看解决办法
    Linux中chown和chmod的区别和用法(转)
    linux jps 命令
    org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService: mapreduce_shuffle do
    静默安装oracle 11g,环境预检查时报错,SEVERE: [FATAL] PRVF-0002 : 无法检索本地节点名
    windows,cmd中,如何切换到磁盘的根目录下
    windows,cmd中查看当前目录下的文件及文件夹
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3206262.html
Copyright © 2011-2022 走看看