开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:消息队列聊天答案讲解】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11050
消息队列聊天答案讲解
消息队列聊天程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <string.h>
#include <sys/types.h>
//定义三个发送人
#ifdef L
#define M ‘L’
char writer[ ]=” Lucy”
//Lucy 接收消息时消息的类型必须为 L 的 assic 码
#endif
#ifdef B
#define M ‘B’
char writer[ ]=” Bob”
//Bob 接收消息时消息的类型必须为 B 的 assic 码
#ifdef P
#define M ‘P’
char writer[ ]=”Peter”
//Peter 接收消息时消息的类型必须为 P 的 assic 码
#endif
typedef struct msg_my
//消息结构体
{
long mtype ;
//用来存储消息的类型
char name [20];
//用来存发送者的名字
char mtext [100];
//用来存储真正要发送的消息的内容
}MSG;
int main (int argc, char **argv)
{
char buff [ 120] =””;
int msgid;
MSG msg;
//key_t key;
//key =ftok (“.”.0xFF);
//通过 ftok 获取 key 值
if((msgid =msgget((key_t)12345,IPC_CREAT|0666))<0)
//创建消息队列
//人为指定生成 key 值
{
perror(“msgid”);
exit(1);
}
if(fork()==0)
{
//检测键盘,组织数据,发送消息到消息队列
while(1)
{
printf(“\r %s:”, writer); //打印发送人提示
fflush(stdout);
fgets(buff,sizeof(buff),stdin); //从键盘获取输入
buff[strlen(buff)-1]=’\0’; //将 \n 变成 \0
if(buff[0]==’L’||buff[0]==’P’||buff[0]==’B’)
{
msg.mtype=(long)buff[0];
//消息类型(这里进行了强制类型转换)
strcpy(msg.name,writer);
strcpy(msg.mtext,buff+2);
msgsnd(msgid,&msg,sizeof(msg)-sizeof(long),0);
//添加消息
}
}
}
else
{
//从消息列表中,安装“我“消息类型接收消息
while(1)
{
//只接受自己名字首字母大写类型的消息
msgrcv(msgid,&msg,sizeof(msg)-sizeof(long),(long int)(M),0);
//每次循环从 msgid 队列中接收消息存入 msg 结构体中,(M)表//示只接收该类型的消息,0表示如果没有该类型消息即堵塞,反之,
//进行下一步,打印消息
printf(“\rmessage from %s:%s\n”,msg.name,msg.mtext)
printf(“\r%s:”, writer);
fflush(stdout);//人为刷新缓冲区
}
}
}
在 make 中注意,根据定义不同的宏,编译不同可定义程序。