zoukankan      html  css  js  c++  java
  • 学习共享操作的代码及心得

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

    要提醒的是指明的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. }


  • 相关阅读:
    Ext.Net学习笔记12:Ext.Net GridPanel Filter用法
    Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法
    Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法
    Ext.Net学习笔记11:Ext.Net GridPanel的用法
    Ext.Net学习笔记09:Ext.Net Store的用法
    Ext.Net学习笔记10:Ext.Net ComboBox用法
    Ext.Net学习笔记08:Ext.Net中使用数据
    Ext.Net学习笔记07:Ext.Net DirectMethods用法详解
    Ext.Net学习笔记06:Ext.Net DirectEvents用方补充
    Ext.Net学习笔记04:Ext.Net布局
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9410150.html
Copyright © 2011-2022 走看看