共享内存为是一种非常有效,速度快,适宜各进程间传递较大的数据。但是,共享内存不会随着程序终止而释放,须用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("666666666666666666666\n");
-
}
-
-
}
-
}
-
}
-
-
shmdt(shmname); //将共享内存从当前进程分离
-
shmctl(shmid, IPC_RMID, NULL);
-
shmdt(shmstr); //将共享内存从当前进程分离
-
shmctl(shmid2, IPC_RMID, NULL);
-
return 0;
-
}
阅读(1293) | 评论(0) | 转发(0) |