Linux的共享内存技术

文章作者 100test 发表时间 2007:09:06 12:08:27
来源 100Test.Com百考试题网


  第一个是写数据:
  /***** testwrite.c *******/
  #include
  #include
  #include
  #include
  typedef struct{
  char name[4].
  int age.
  } people.
  main(int argc, char** argv)
  {
  int shm_id,i.
  key_t key.
  char temp.
  people *p_map.
  char* name = "/dev/shm/myshm2".
  key = ftok(name,0).
  if(key==-1)
  perror("ftok error").
  /*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
  shm_id=shmget(key,4096,IPC_CREAT).
  if(shm_id==-1)
  {
  perror("shmget error").
  return.
  }
  /*将这块共享内存区附加到自己的内存段*/
  p_map=(people*)shmat(shm_id,NULL,0).
  temp=a.
  for(i = 0.i<10.i )
  {
  temp =1.
  memcpy((*(p_map i)).name,&.temp,1).
  (*(p_map i)).age=20 i.
  }
  /*写数据完毕,将其从自己的内存段中“删除”出去*/
  if(shmdt(p_map)==-1)
  perror(" detach error ").
  }

  /*读进程首先要得到那块内存块,这个时候,ftok根据文件名和ID创建的key就
  很用了,步骤同创建是一样的*/
  /********** testread.c ************/
  #include
  #include
  #include
  #include
  typedef struct{
  char name[4].
  int age.
  } people.
  main(int argc, char** argv)
  {
  int shm_id,i.
  key_t key.
  people *p_map.
  char* name = "/dev/shm/myshm2".
  key = ftok(name,0).
  if(key == -1)
  perror("ftok error").
  shm_id = shmget(key,4096,IPC_CREAT).
  if(shm_id == -1)
  {
  perror("shmget error").
  return.
  }
  p_map = (people*)shmat(shm_id,NULL,0).
  for(i = 0.i<10.i )
  {
  printf( "name:%s\n",(*(p_map i)).name ).
  printf( "age %d\n",(*(p_map i)).age ).
  }
  if(shmdt(p_map) == -1)
  perror(" detach error ").
  }

  注:事实上,ftok函数仅仅是根据文件名和ID生成一个起标识作用的key,根据《GNU Linux编程指南》说,Linux下实现这一函数还有点问题,不推荐用。于是我一般来说都是自己定义一个唯一的key,而不使用ftok函数。


相关文章


Shell脚本实现vi_cp_mv前自动备份源文件
VPM小型虚拟机软件在多平台上体验Linux
介绍Linux操作系统下的U 硬件设备驱动
Linux下利用Squid构建高速的ProxyServer
Linux的共享内存技术
Apache服务器虚拟主机设置技术深入解析
文件权限管理-POSIXACL
Linux服务器历险优化Linux
Linux实用代码--文件系统操作
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛