这段小代码可以很好的让我理解共享内存的操作

要提醒的是指明的key文件必须是已经存在的,ftok不会自己创建, 我刚开始以为是ftok会创建key值文件的,结果程序运行报错,现在把创建文件的功能写入程序里

  1. //         /////   tWrite.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>  //for thread
  5. #include <sys/shm.h>  //shmat
  6. #include <sys/errno.h>
  7. /*
  8. 0666表示权限,跟文件的权限设置是一样的。   
  9.     
  10.   4   2   1   分别表示,读   写   执行,3种权限。   
  11.     
  12.   比如,上面的   6   =   4   +   2   ,表示   读+写。   
  13.   如果是   7   =   4   +   2   +   1   ,表示   读+写+执行。   
  14.     
  15.   另,0666   每一位表示一种类型的权限,比如,第一个0是UID,第一个表示拥有者的权限,第二个6表示同组权限,第3个6表示他人的权限。   
  16. */
  17. int main()
  18. {
  19.  int liShmId;  //申请的共享内存的开始地址
  20.  key_t key;    //为共享内存申请的key
  21.  char* p_map;  //把这块共享内存映射到自己的程序空间
  22.  char lsData[1024];
  23.  char *lpName = "/home/report/lb/shmkey";
  24. FILE *lpFp = fopen(lpName, "w");
  25. fclose(lpFp);
  26.  key = ftok(lpName, 0);
  27.  if(key == -1)
  28.  {
  29.   printf("ftok return error:%d/n", errno);
  30.   return -1;
  31.  }
  32.  printf("ftok return:%0x/n", key);
  33.  /*先用ftok 创建一个key,再调用shmget,创建一块内存区域*/
  34.  liShmId = shmget(key, 4096, IPC_CREAT | 0666);
  35.  if(liShmId==-1)
  36.  {
  37.   printf("shmget fail! Error Code:%d/n", liShmId);
  38.   return -1;
  39.  }
  40.  /*将这块共享内存区附加到自己的内存块*/
  41.  p_map = (char*)shmat(liShmId, NULL, 0);
  42.  if(p_map==NULL)
  43.  {
  44.   printf("p_map:%0x/n", p_map);
  45.   return -1;
  46.  }
  47.  memset(lsData, 0, sizeof(lsData));
  48.  strcpy(lsData, "共享内存测试程序,此为测试数据");
  49.  memcpy(p_map, lsData, strlen(lsData));
  50.  /*写完数据,将其从自己的内存段中"删除"*/
  51.  if(shmdt(p_map)==-1)
  52.  {
  53.   printf("detach share memory /n");
  54.   return -1;
  55.  }
  56.  /*从系统中删除这块内存*/
     if(shmctl(liShmId, IPC_RMID, 0) < 0) //如果多次使用的话,就不需要这行代码了
     {
      printf("shmctl Error:%d/n", errno);
      return -1;
     }
  57.   return 0;
  58. }

 

 

程序已经创建共享内存段,3099d为返回的键值

 

  1. //tRead.c
  2. /*读进程首先得到共享内存的开始地址,ftok根据创建时的文件名和ID创建的key*/
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <pthread.h>  //for thread
  6. #include <sys/shm.h>  //shmat/
  7. #include <sys/errno.h>
  8. int main()
  9. {
  10.  int liShmId;  //申请的共享内存的开始地址
  11.  key_t key;    //为共享内存申请的key
  12.  char* p_map;  //把这块共享内存映射到自己的程序空间
  13.  char lsData[1024];
  14.  char *lpName = "/home/report/lb/shmkey";
  15.  key = ftok(lpName, 0);
  16.  if(key == -1)
  17.  {
  18.   printf("ftok return error:%0x/n", key);
  19.   return -1;
  20.  }
  21.  /*先用ftok 创建一个key,再调用shmget,创建一块内存区域*/
  22.  liShmId = shmget(key, 4096, IPC_CREAT | 0666);
  23.  if(liShmId==-1)
  24.  {
  25.   printf("shmget fail! Error Code:%d/n", errno);
  26.   return -1;
  27.  }
  28.  /*将这块共享内存区附加到自己的内存块*/
  29.  p_map = (char*)shmat(liShmId, NULL, 0);
  30.  printf("共享内存的数据:%s/n", p_map);
  31.  /*写完数据,将其从自己的内存段中"删除"*/
  32.  if(shmdt(p_map)==-1)
  33.  {
  34.   printf("detach share memory /n");
  35.   return -1;
  36.  }
  37.  return 0;
  38. }