Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119128
  • 博文数量: 23
  • 博客积分: 269
  • 博客等级: 入伍新兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-22 10:38
文章分类

全部博文(23)

文章存档

2014年(1)

2012年(22)

分类: LINUX

2012-03-09 16:11:55

一.system V 共享内存方式:
  1.int shmget(key_t key, size_t size, int shmflg);
      1> key 为共享内存标识,为一个数字,表示要打开的共享内存块。
      2> size指定共享内存大小,
      3>
shmflg标识内存的所有情况,IPC_CREAT 表示如果共享内存不存在,就创建,否则打
           开对应共享内存,IPC_EXCL 表示如果共享内存不存在,则打开,否则产生错误,
      4>  调用成功则返回共享内存的ID,失败则返回一个负数。
      例:
  

  1. #define IPC_NAME 1630
  2.         int shm_id;
  3.         size_t size=4096
  4.         shm_id=shmget(IPC_NAME,size,IPC_CREAT | IPC_EXCL |0666);
   2.void* shmat( int shm_id,void *shmaddr , int shmflag )
     1> shm_id  为共享内存块的ID,
     2> shmaddr 指定要获取的共享内存偏移量。
例:
  1. p_map=(people*)shmat(shm_id,NULL,0);
  2. if((int64_t)p_map == -1) return 0;

  3.int shmctl( int shmid , int cmd , struct shmid_ds *buf );
     1> int shmid:是共享内存的ID.
     2> int cmd: 是控制命令,可取值如下:
            IPC_STAT 得到共享内存的状态,
            IPC_SET 改变共享内存的状态
            IPC_RMID 删除共享内存
     3> struct shmid_ds *buf 是一个结构体指针。
            IPC_STAT的时候,取得的状态放在这个结构体中。
            如果要改变共享内存的状态,用这个结构体指定。
     4> 返回值: 成功:0失败:-1   
     5> 使用例子:   shmctl(shmid,IPC_RMID,NULL);
   4.int shmdt( char *shmaddr );
     1> char *shmaddr 表示本进程使用的共享内存块的相对地址。
     将由 shmat 函数返回的地址传递给这个函数,然后函数将该地址与共享内存块脱离关系。
     对 exit 或任何exec族函数的调用都会自动使进程脱离共享内存块。
例:
  1. #include <sys/ipc.h>
  2. #include <sys/shm.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. typedef struct
  8. {
  9.         char name;
  10.         int age;
  11. }people;

  12. #define IPC_NAME 1630
  13. int main(int argc,char **argv)
  14. {
  15.      int shm_id,i;
  16.      key_t key;
  17.      char temp_char;
  18.      people *p_map;

  19.     shm_id=shmget(IPC_NAME,4096,IPC_CREAT | IPC_EXCL |0666);
  20.     if(shm_id<0)
  21.     {
  22.         printf("shmget error\n");
  23.         if(errno != EEXIST) return 1;

  24.         shm_id = shmget(IPC_NAME,4096,0666);
  25.         if(shm_id < 0)
  26.         {
  27.             return 0;
  28.         }
  29.         printf("shmget open %d succedd\n",IPC_NAME);
  30.     }
  31.     p_map=(people*)shmat(shm_id,NULL,0);
  32.     if((int64_t)p_map == -1) return 0;
  33.     printf("%x\n",p_map);
  34.     for(int i=0; i<12; ++i)
  35.     {
  36.         printf("name=%c,age=%d\n",p_map->name,p_map->age);
  37.         ++p_map;
  38.     }
  39.     temp_char='a';
  40.     p_map = p_map - 12;
  41.     for(i=0;i<10;i++)
  42.     {
  43.         (*(p_map+i)).name=temp_char;
  44.         (*(p_map+i)).age=20+i;
  45.         temp_char+=1;
  46.     }
  47.     printf("Write end\n");
  48.     if(shmdt(p_map)<0)
  49.         printf("detach error");
  50.     int ret = shmctl(shm_id,IPC_RMID,NULL);
  51.     if(ret < 0)
  52.     {
  53.         printf("Deltet shm memery failed\n");
  54.     }
  55.     else{
  56.         printf("Delete shm memory Succedd\n");
  57.     }
  58.     return 0;
  59. }

阅读(1403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~