灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2578回复:0

linux共享内存聊天室

楼主#
更多 发布于:2012-08-27 15:08

linux共享内存聊天室
共享内存为是一种非常有效,速度快,适宜各进程间传递较大的数据。但是,共享内存不会随着程序终止而释放,须用shmctl共享内存区释放,否则,会一直残留在系统内存区中,影响运行效率。
本实践中,要实现聊天室的功能,开始时建立单次显示,覆盖共享内存的方法,发现输出的死循环难以控制,缺乏阻塞,后来改用数组存储,将共享内存划分成N个子区间,多终端共同读写时,子区间的移位难以控制。  
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#define KEY         123456
#define SIZE        10240
#define MYKEY       1346766
#define IKEY        13467669
int main()
{
     int shmid;
     char *shmname;                      //定义输入姓名的共享内存
  
     int shmid2;
     char *shmstr;                       //定义输入语句的共享内存
  
  
     int j=0;
     int i=0;
     char temp[100];
      
     shmid = shmget(IKEY, SIZE, IPC_CREAT | 0600);  
     if(shmname= (char *) shmat(shmid, 0, 0));     //连接共享共存
    
     if(shmid==-1)
     printf("shmid error");
  
    
     shmid2 = shmget(MYKEY, SIZE, IPC_CREAT | 0600);  
     shmstr= (char *) shmat(shmid2, 0, 0);
     if(shmid2==-1)  
     printf("shmid2 error");
    
      memset(shmname,0,SIZE);
      memset(shmstr,0,SIZE);
      
    char myname[10];
  
    printf("请输入你的姓名:");
  
    scanf("%s",myname);                          //输入本地用户名
    printf(":%s 已经成功登录n",myname);
  
    pid_t id;  
    
    if((id=fork())==-1) printf("fork error");
  
   //printf("here 1");
  
    if(id==0)                               //子进程用于输出
    {      
        while(1)
            {
          
            if(*(shmstr+j*100)!=0)
                {  
                  
                    printf("第%d句",j);
                    printf("%s 说:",shmname);
                    printf("%s",(shmstr+j*100)) ;
                    j++;  
                    printf("n");
                  
                   // break;
                    //sleep(1);        
                }
          
            }
                  
    }
  
  
   else if(id >0)
   {          
      
       while(1)
       {
            scanf("%s",temp);                //存贮临时语句
        for(i=0;i<1000;i++)
         {
          
          // printf("第%d个单元",i);              
            if(*(shmstr+100*i)==0)
            {
          
            strcpy(shmname,myname);                    //将当前进程的用户名拷入到姓名共享内存中
                                      
            strcpy(shmstr+100*i,temp);  
            break;  
                                                  
           // printf("666666666666666666666n");
            }
          
         }  
       }  
   }
      shmdt(shmname);                          //将共享内存从当前进程分离  
      shmctl(shmid, IPC_RMID, NULL);        
      shmdt(shmstr);                          //将共享内存从当前进程分离  
      shmctl(shmid2, IPC_RMID, NULL);        
      return 0;
}

喜欢0 评分0
游客

返回顶部