Chinaunix首页 | 论坛 | 博客
  • 博客访问: 332769
  • 博文数量: 45
  • 博客积分: 669
  • 博客等级: 上士
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-27 17:59
文章分类
文章存档

2015年(5)

2014年(6)

2013年(4)

2012年(30)

分类: LINUX

2012-07-19 19:10:21

共享内存为是一种非常有效,速度快,适宜各进程间传递较大的数据。但是,共享内存不会随着程序终止而释放,须用shmctl共享内存区释放,否则,会一直残留在系统内存区中,影响运行效率。
本实践中,要实现聊天室的功能,开始时建立单次显示,覆盖共享内存的方法,发现输出的死循环难以控制,缺乏阻塞,后来改用数组存储,将共享内存划分成N个子区间,多终端共同读写时,子区间的移位难以控制,经过多次尝试,终于实现了聊天室的功能。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. #include<sys/ipc.h>
  8. #include<sys/shm.h>
  9. #include<stdio.h>

  10. #define KEY 123456
  11. #define SIZE 10240

  12. #define MYKEY 1346766
  13. #define IKEY 13467669


  14. int main()
  15. {
  16.      int shmid;
  17.      char *shmname; //定义输入姓名的共享内存
  18.   
  19.    
  20.      int shmid2;
  21.      char *shmstr; //定义输入语句的共享内存
  22.     
  23.   
  24.    
  25.      
  26.      int j=0;
  27.      int i=0;
  28.      char temp[100];
  29.        
  30.      shmid = shmget(IKEY, SIZE, IPC_CREAT | 0600);
  31.      if(shmname= (char *) shmat(shmid, 0, 0)); //连接共享共存
  32.     
  33.      if(shmid==-1)
  34.      printf("shmid error");
  35.   
  36.     
  37.     
  38.      shmid2 = shmget(MYKEY, SIZE, IPC_CREAT | 0600);
  39.      shmstr= (char *) shmat(shmid2, 0, 0);
  40.      if(shmid2==-1)
  41.      printf("shmid2 error");
  42.     
  43.  
  44.    
  45.       memset(shmname,0,SIZE);
  46.       memset(shmstr,0,SIZE);
  47.        
  48.        
  49.     char myname[10];
  50.    
  51.     printf("请输入你的姓名:");
  52.    
  53.     scanf("%s",myname); //输入本地用户名
  54.     printf(":%s 已经成功登录\n",myname);
  55.    
  56.     pid_t id;
  57.     
  58.     if((id=fork())==-1) printf("fork error");
  59.    
  60.    //printf("here 1");
  61.    
  62.     if(id==0) //子进程用于输出
  63.     {
  64.         while(1)
  65.             {
  66.            
  67.             if(*(shmstr+j*100)!=0)
  68.                 {
  69.                   
  70.                     printf("第%d句",j);
  71.                     printf("%s 说:",shmname);
  72.                     printf("%s",(shmstr+j*100)) ;
  73.                     j++;
  74.                     printf("\n");
  75.                   
  76.                    // break;
  77.                     //sleep(1);
  78.                 }
  79.           
  80.             }
  81.                    
  82.     }
  83.    
  84.   
  85.   
  86.    else if(id >0)
  87.    {
  88.       
  89.        while(1)
  90.        {
  91.             scanf("%s",temp); //存贮临时语句
  92.         for(i=0;i<1000;i++)
  93.          {
  94.            
  95.           // printf("第%d个单元",i);
  96.            
  97.             if(*(shmstr+100*i)==0)
  98.             {
  99.            
  100.             strcpy(shmname,myname); //将当前进程的用户名拷入到姓名共享内存中
  101.                                        
  102.            
  103.             strcpy(shmstr+100*i,temp);
  104.             break;
  105.                                                    
  106.            // printf("666666666666666666666\n");
  107.             }
  108.            
  109.          }
  110.        }
  111.    }

  112.       shmdt(shmname); //将共享内存从当前进程分离
  113.       shmctl(shmid, IPC_RMID, NULL);
  114.       shmdt(shmstr); //将共享内存从当前进程分离
  115.       shmctl(shmid2, IPC_RMID, NULL);
  116.       return 0;
  117. }


阅读(1245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~