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;
}