注意:下面介绍的函数都需要导入头文件
①“消息”结构体是一个需要用户自行定义的结构体,但是必须满足一定的格式;
②该结构体中只能有两个成员,分别是long类型的mtype用于表示消息的类型,以及char[]类型的mtext表示消息的文本,定义方式如下:
struct msgform
{
long mtype; //消息类型
char mtext[消息长度] ; //消息文本
}msg;
函数伪定义:
int msgqid=msgget(key,flag)
①msgget函数用于创建一个消息队列。
②key参数用于区分不同的消息队列,用一个整数表示。
③flag是用户设置的标志和访问方式。常用的参数为IPC_CREAT|0400(表示如果该消息队列已经存在则打开这个消息队列,否则创建这个名称的消息队列)。
④返回值:表示消息队列的编号,如果返回-1则表示创建消息队列失败。
函数伪定义:
void msgsnd(msgqid,msgp,size,flag)
①msgsnd函数用于向消息队列中发送一条消息,排在消息队列尾部。
②msgqid参数表示消息队列的编号(msgget函数的返回值即为生成的消息队列的编号);
③msgp参数表示一个指向“消息”结构体的指针。
④size表示指向的消息结构体中消息的长度(以字节为单位)。
⑤flag一般设置为0。
函数伪定义:
void msgrcv(msgqid,msgp,size,type,flag)
①msgrcv函数用于从消息队列的队头取出一条信息。
②msgp表示指向一个消息结构体的指针。
③size表示消息结构体中消息的长度(以字节计算)。
④type和flag一般都设置为0。
函数伪定义:
void msgctl(msgqid,cmd,buf)
①msgqid表示需要操作的消息队列编号;
②cmd表示操作类型,最常用的参数是删除消息队列参数:IPC_RMID
③buf一般置为0。
题目内容:假设有2个用户lucy和peter, 使用消息队列进行通信,Lucy先发言,实现2人之间的聊天功能。当任意一方输入quit时,停止通信,程序结束。
Lucy进程代码:
#include
#include
#include
struct msgform
{
long mtype;
char mtext[1024];
}m;
int isQuit(char* p)
{
if(p[0]=='q'&&p[1]=='u'&&p[2]=='i'&&p[3]=='t')
{
return 1;
}
else return 0;
}
int main(void)
{
m.mtype=1;
int qid=msgget(12345,IPC_CREAT|400);
while(1)
{
printf("Lucy:");
scanf("%s",m.mtext);
if(isQuit(m.mtext)==1)
{
printf("\n聊天结束。\n");
msgctl(qid,IPC_RMID,0);
exit(1);
}
msgsnd(qid,&m,1024,0);
msgrcv(qid,&m,1024,2,0);
printf("Peter:%s\n",m.mtext);
m.mtype=1;
}
return 0;
}
Peter进程代码:
#include
#include
#include
struct msgform
{
long mtype;
char mtext[1024];
}m;
int isQuit(char* p)
{
if(p[0]=='q'&&p[1]=='u'&&p[2]=='i'&&p[3]=='t')
{
return 1;
}
else return 0;
}
int main(void)
{
m.mtype=2;
int qid=msgget(12345,IPC_CREAT|400);
while(1)
{
msgrcv(qid,&m,1024,1,0);
printf("Lucy:%s\n",m.mtext);
m.mtype=2;
printf("Peter:");
scanf("%s",m.mtext);
if(isQuit(m.mtext)==1)
{
printf("\n聊天结束。\n");
msgctl(qid,IPC_RMID,0);
exit(1);
}
msgsnd(qid,&m,1024,0);
}
return 0;
}
运行效果: