Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4041390
  • 博文数量: 366
  • 博客积分: 9916
  • 博客等级: 中将
  • 技术积分: 7195
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-29 23:27
个人简介

简单!

文章分类

全部博文(366)

文章存档

2013年(51)

2012年(269)

2011年(46)

分类: LINUX

2011-08-07 16:59:06

  1. 源代码是从别人的文章中抄过来的,不是原创,不过写得不错,主要是描述两个不同的进程从共享内存中存取数据的技术:

  2. 第一个是写数据:
  3. /***** testwrite.c *******/
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. typedef struct{
  9.         char name[4];
  10.         int age;
  11. } people;
  12. main(int argc, char** argv)
  13. {
  14.         int shm_id,i;
  15.         key_t key;
  16.         char temp;
  17.         people *p_map;
  18.         char* name = "/dev/shm/myshm2";
  19.         key = ftok(name,0);
  20.         if(key==-1)
  21.                 perror("ftok error");
  22. /*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
  23.         shm_id=shmget(key,4096,IPC_CREAT);
  24.         if(shm_id==-1)
  25.         {
  26.                 perror("shmget error");
  27.                 return;
  28.         }
  29. /*将这块共享内存区附加到自己的内存段*/
  30.         p_map=(people*)shmat(shm_id,NULL,0);
  31.         temp='a';
  32.         for(i = 0;i<10;i++)
  33.         {
  34.                 temp+=1;
  35.                 memcpy((*(p_map+i)).name,&temp,1);
  36.                 (*(p_map+i)).age=20+i;
  37.         }
  38. /*写数据完毕,将其从自己的内存段中“删除”出去*/
  39.         if(shmdt(p_map)==-1)
  40.                 perror(" detach error ");
  41. }

  42. /*读进程首先要得到那块内存块,这个时候,ftok根据文件名和ID创建的key就
  43. 很用了,步骤同创建是一样的*/
  44. /********** testread.c ************/
  45. #include <sys/ipc.h>
  46. #include <sys/shm.h>
  47. #include <sys/types.h>
  48. #include <unistd.h>
  49. typedef struct{
  50.         char name[4];
  51.         int age;
  52. } people;
  53. main(int argc, char** argv)
  54. {
  55.         int shm_id,i;
  56.         key_t key;
  57.         people *p_map;
  58.         char* name = "/dev/shm/myshm2";
  59.         key = ftok(name,0);
  60.         if(key == -1)
  61.                 perror("ftok error");
  62.         shm_id = shmget(key,4096,IPC_CREAT);
  63.         if(shm_id == -1)
  64.         {
  65.                 perror("shmget error");
  66.                 return;
  67.         }
  68.         p_map = (people*)shmat(shm_id,NULL,0);
  69.         for(i = 0;i<10;i++)
  70.         {
  71.         printf( "name:%s\n",(*(p_map+i)).name );
  72.         printf( "age %d\n",(*(p_map+i)).age );
  73.         }
  74.         if(shmdt(p_map) == -1)
  75.                 perror(" detach error ");
  76. }

  77. 注:事实上,ftok函数仅仅是根据文件名和ID生成一个起标识作用的key,根据《GNU Linux编程指南》说,Linux下实现这一函数还有点问题,不推荐用。

 

摘自

阅读(822) | 评论(1) | 转发(0) |
0

上一篇:Hello World模块

下一篇:memset的使用

给主人留下些什么吧!~~

txgc_wm2011-08-07 17:15:16

测试该程序时,需先创建文件/dev/shm/myshm2