Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1177008
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 15:25:02

shared.c

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>

  6. #define IPCKEY 0x13

  7. typedef struct myshm
  8. {
  9.         int num;
  10.         char name[128];
  11.         char value[128];
  12. }MYSHM;

  13. int main(int argc, char * * argv)
  14. {
  15.         MYSHM * myshared;
  16.     
  17.         int ret;
  18.         struct shmid_ds shm_info;
  19.         /*共享内存属性结构体:每个共享内存都有一个 struct shmid_ds 与其相关联*/

  20.         char path[1024];
  21.         memset(path, 0, sizeof(path));
  22.         strcpy(path, "/etc/hosts");
  23.         printf("path=[%s]\n", path);

  24.         key_t key = 0;
  25.         printf("key=[%x]\n", key);
  26.         /*path必须是已经存在的文件名,将path文件的索引节点号取出,
  27.         前面加上子序号IPCKEY,得到key_t的返回值。
  28.         功能:可以保证两个不同用户下的两组相同程序获得互不干扰的IPC键值。
  29.         */
  30.         key = ftok(path, IPCKEY);
  31.         if(key < 0)
  32.         {
  33.                 printf("ftok err!\n");
  34.                 exit(-1);
  35.         }
  36.         printf("key=[%x]\n", key);
  37.         
  38.         int shmid;
  39.         
  40.         /*shmget功能:创建一个新的共享内存段,或者引用一个现存的共享内存段*/
  41.         shmid = shmget(key, sizeof(struct myshm), IPC_CREAT|0777);
  42.         if(shmid < 0)
  43.         {
  44.                 printf("shmget err!\n");
  45.                 exit(-1);
  46.         }
  47.         printf("shmid=[%d]\n", shmid);
  48.         
  49.         /*shmat功能:在本进程申请地址空间,并将shmid共享内存段 与 本进程地址空间 首地址连接 并一一映射*/
  50.         myshared = (struct myshm *)shmat(shmid, NULL, 0);
  51.         if(myshared == NULL)
  52.         {
  53.                 printf("shmat err!\n");
  54.                 exit(-1);
  55.         }
  56.         printf("myshared=[%p]\n", myshared);
  57.         
  58.         myshared->num = 1;
  59.         memset(myshared->name, 0, sizeof(myshared->name));
  60.         strcpy(myshared->name, "wangxiancai");
  61.         memset(myshared->value, 0, sizeof(myshared->value));
  62.         strcpy(myshared->value, "wangxiancai123");
  63.         
  64.         /*shmctl 函数
  65.         IPC_STAT:取得此队列的struct shmid_ds结构,存放在shm_info中
  66.         IPC_SET:按照 shm_info 结构中的值,设置此队列的 struct shmid_ds 结构
  67.         IPC_RMID:该段在本进程中标示符是立即删除的,本进程与共享内存段立即脱钩,所以不能再用shmat与该段连接。
  68.         但是,不会从系统中实际删除共享内存段,除非最后使用该段的最后一个进程终止或与该段脱接。    */
  69.         ret = shmctl(shmid, IPC_STAT, &shm_info);
  70.         if(ret < 0)
  71.         {
  72.                 printf("shmctl err!\n");
  73.                 exit(-1);
  74.         }
  75.         
  76.         printf("共享内存段的属性:\n");
  77.         printf("共享内存段的大小=[%d]\n", shm_info.shm_segsz);
  78.         printf("最后操作该段的进程PID=[%d]\n", shm_info.shm_lpid);
  79.         printf("创建该共享内存段的进程PID=[%d]\n", shm_info.shm_cpid);
  80.         printf("该共享内存段当前连接的进程数=[%d]\n", shm_info.shm_nattch);
  81.         printf("最后一个进程连接该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_atime)));
  82.         printf("最后一个进程离开该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_dtime)));
  83.         printf("最后一个进程修改该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_ctime)));
  84.         
  85.         /*shmdt*/
  86.         
  87.         while(1);
  88.     
  89.         return 0;
  90.         /*进程终止时:用shmat连接的共享内存区会自动断开,
  91.         即使没有执行shmctl(IPC_RMID),没有执行shmdt()也会自动断开。
  92.         ipcs查看时,nattch数量会减1。
  93.         */
  94.         
  95. }
shared2.c

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>

  6. #define IPCKEY 0x13

  7. typedef struct myshm
  8. {
  9.         int num;
  10.         char name[128];
  11.         char value[128];
  12. }MYSHM;

  13. int main(int argc, char * * argv)
  14. {
  15.         MYSHM * myshared;
  16.     
  17.         int ret;
  18.         struct shmid_ds shm_info;
  19.         /*共享内存属性结构体:每个共享内存都有一个 struct shmid_ds 与其相关联*/

  20.         char path[1024];
  21.         memset(path, 0, sizeof(path));
  22.         strcpy(path, "/etc/hosts");
  23.         printf("path=[%s]\n", path);

  24.         key_t key = 0;
  25.         printf("key=[%x]\n", key);
  26.         /*path必须是已经存在的文件名,将path文件的索引节点号取出,
  27.         前面加上子序号IPCKEY,得到key_t的返回值。
  28.         功能:可以保证两个不同用户下的两组相同程序获得互不干扰的IPC键值。
  29.         */
  30.         key = ftok(path, IPCKEY);
  31.         if(key < 0)
  32.         {
  33.                 printf("ftok err!\n");
  34.                 exit(-1);
  35.         }
  36.         printf("key=[%x]\n", key);
  37.         
  38.         int shmid;
  39.         
  40.         /*shmget功能:创建一个新的共享内存段,或者引用一个现存的共享内存段*/
  41.         shmid = shmget(key, sizeof(struct myshm), IPC_CREAT|0777);
  42.         if(shmid < 0)
  43.         {
  44.                 printf("shmget err!\n");
  45.                 exit(-1);
  46.         }
  47.         printf("shmid=[%d]\n", shmid);
  48.         
  49.         /*shmat功能:shmid共享内存段连接到调用进程的地址上*/
  50.         myshared = (struct myshm *)shmat(shmid, NULL, 0);
  51.         if(myshared == NULL)
  52.         {
  53.                 printf("shmat err!\n");
  54.                 exit(-1);
  55.         }
  56.         printf("myshared=[%p]\n", myshared);
  57.         
  58.         printf("myshared->num=[%d]\n", myshared->num);
  59.         printf("myshared->name=[%s]\n", myshared->name);
  60.         printf("myshared->value=[%s]\n", myshared->value);
  61.         
  62.         /*shmctl 函数
  63.         IPC_STAT:取得此队列的struct shmid_ds结构,存放在shm_info中
  64.         IPC_SET:按照 shm_info 结构中的值,设置此队列的 struct shmid_ds 结构
  65.         IPC_RMID:该段在本进程中标示符是立即删除的,本进程与共享内存段立即脱接,所以不能再用shmat与该段连接。
  66.         但是,不会从系统中实际删除共享内存段,除非最后使用该段的最后一个进程终止或与该段脱接。    
  67.         */
  68.         ret = shmctl(shmid, IPC_STAT, &shm_info);
  69.         if(ret < 0)
  70.         {
  71.                 printf("shmctl err!\n");
  72.                 exit(-1);
  73.         }
  74.         
  75.         printf("共享内存段的属性:\n");
  76.         printf("共享内存段的大小=[%d]\n", shm_info.shm_segsz);
  77.         printf("最后操作该段的进程PID=[%d]\n", shm_info.shm_lpid);
  78.         printf("创建该共享内存段的进程PID=[%d]\n", shm_info.shm_cpid);
  79.         printf("该共享内存段当前连接的进程数=[%d]\n", shm_info.shm_nattch);
  80.         printf("最后一个进程连接该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_atime)));
  81.         printf("最后一个进程离开该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_dtime)));
  82.         printf("最后一个进程修改该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_ctime)));
  83.         
  84.         /*shmdt*/
  85.         ret = shmdt(myshared);
  86.         if(ret < 0)
  87.         {
  88.                 printf("shmdt err!\n");
  89.                 exit(-1);
  90.         }
  91.         
  92.                 /*shmctl 函数
  93.         IPC_STAT:取得此队列的struct shmid_ds结构,存放在shm_info中
  94.         IPC_SET:按照 shm_info 结构中的值,设置此队列的 struct shmid_ds 结构
  95.         IPC_RMID:该段在本进程中标示符是立即删除的,本进程与共享内存段立即脱接,所以不能再用shmat与该段连接。
  96.         但是,不会从系统中实际删除共享内存段,除非最后使用该段的最后一个进程终止或与该段脱接。    
  97.         */
  98.         ret = shmctl(shmid, IPC_STAT, &shm_info);
  99.         if(ret < 0)
  100.         {
  101.                 printf("shmctl err!\n");
  102.                 exit(-1);
  103.         }
  104.         
  105.         printf("共享内存段的属性:\n");
  106.         printf("共享内存段的大小=[%d]\n", shm_info.shm_segsz);
  107.         printf("最后操作该段的进程PID=[%d]\n", shm_info.shm_lpid);
  108.         printf("创建该共享内存段的进程PID=[%d]\n", shm_info.shm_cpid);
  109.         printf("该共享内存段当前连接的进程数=[%d]\n", shm_info.shm_nattch);
  110.         printf("最后一个进程连接该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_atime)));
  111.         printf("最后一个进程离开该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_dtime)));
  112.         printf("最后一个进程修改该共享内存段的时间=[%s]\n", ctime(&(shm_info.shm_ctime)));
  113.         
  114.             
  115.                 
  116.         while(1);
  117.     
  118.         return 0;
  119. }

阅读(416) | 评论(0) | 转发(0) |
0

上一篇:信号量集合

下一篇:socket客户端

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