开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Msgrcv 接收消息】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11048
Msgrcv 接收消息
内容介绍:
一、接收消息
二、代码实现
一、 接收消息
1.格式
#include <sys/msg.h>
ssize _t msgrcv(int msqid , void *msgp , size_t msgsz ,long msgtyp, int msgflg);
2.功能:
从标识符为 msqid 的消息队列中接收一个消息。一旦接收消息成功,则消息在消息队列中被删除。
3.参数:
msqid:消息队列的标识符,代表要从哪个消息列中获取消息。
mSgp:存放消息结构体的地址。
mSgsz:消息正文的字节数。
msgtyp:消息的类型、可以有以下几种类型:(最好不要是0)
msgtyp =0:返回队列中的第一个消息
msgtyp >0:返回队列中消息类型为 msgtyp 的消息
msgtyp<0:返回队列中消息类型值小于或等于 msgtyp 绝对值的消息,如果这种消息有若干个,则取类型值最小的消息。
4.注意:
(1)若消息队列中有多种类型的消息, msgrcv 获取消息的时候按消息类型获取,不是先进先出的。
(2)在获取某类型消息的时候,若队列中有多条此类型的消息,则获取最先添加的消息,即先进先出原则。
(3)msgflg:函数的控制属性
0:msgrcv_ 调用阻塞直到接收消息成功为止。
MSG_NOERROR:若返回的消息字节数比 nbytes 字节数多,则消息就会截短到 nbytes 字节,且不通知消息发送进程。
IPC_NOWAIT:调用进程会立即返回。若没有收到消息则立即返回-1。
5.返回值:
成功返回读取消息的长度,失败返回-1.
二、代码实现
#include <stdio.h>
#include<unsitd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include <sys / msg. h>
#include<string.h>
typedef struct msg {
//定义一个结构体
long typ
e ;
//类型名,第一个必须是长整型
char text [200];
char name [20];
}MSG;
//新结构体的类型名为 MSG
int main(int argc, char *agrv[ ])
{
key_t key;
//定义一个变量 key 值
MSG m;
//定义一个结构体变量 m
int masg_id;
int ret;
//定义一个整型变量 ret
key = ftok(“.”, 1);
//当前目录加一得到 key 值
if(key == -1)
{
perror(“ftok”);
return 0;
}
printf(“key= %d\n” ,key);
msg_id = msgget(key ,IPC_CREAT|0666);
printf(“msg_id = %d\n” ,msg_id);
ret = msgrcv(msg_id ,&m, sizeof(m)-4,2,0);
//接收消息,从msg_id 中获取消息,读取类型为2的消息
if(ret == -1)
//判断是否接收成功
{
perror(“msgrcv”);
return 0;
}
printf(“收到消息 %ld %s $s\n”,m.type,m.text,m.name);
//接收成功,打印出消息
ret = msgrcv(msg_id ,&m, sizeof(m)-4,3,0);
//接收类型为3的消息
if(ret == -1)
{
perror(“msgrcv”);
return 0;
}
printf(“收到消息 %ld %s $s\n”,m.type,m.text,m.name);
ret = msgrcv(msg_id ,&m, sizeof(m)-4,1,0);
//接收类型为1的消息
if(ret == -1)
{
perror(“msgrcv”);
return 0;
}
printf(“收到消息 %d %s $s\n”,m.type,m.text,m.name);
return 0;
}
接收结果如下,可知不同类型的消息可以按类型读取(类型相同的消息按先进先出读取)
此时,队列中没有消息