qfedu-linux-advanced-level/day5/rec_sed/msgque3_receiver.c

62 lines
2.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <sys/types.h> // 系统数据类型定义
#include <sys/ipc.h> // IPC相关头文件
#include <sys/msg.h> // 消息队列相关头文件
#include <string.h> // 字符串操作
#include <stdlib.h> // atol 函数
// 消息结构体
typedef struct msg_
{
long mType; // 消息类型,必须是 long ,必须在第一个位置
char content[100]; // 消息内容,需要小于消息队列的限制值(8192)
char title[32]; // 消息标题
} MSG;
// msgget 函数用于创建消息队列参数1是键值参数2是权限
int main(int argc, char *argv[])
{
// 参数个数判断
if (argc != 2)
{
printf("Usage: %s <type>\n", argv[0]);
return 1;
}
key_t key = ftok("/", 200); // 获取消息队列的键值
int msgqid = msgget(key, IPC_CREAT | 0666); // 创建消息队列
if (msgqid == -1)
{
perror("msgget");
return 1;
}
// 接收消息
MSG msg; // 消息结构体
long mtype = atol(argv[1]); // 消息类型
// 最后参数 0 表示阻塞,如果消息队列为空,接收消息的进程会阻塞
ssize_t len = msgrcv(msgqid, &msg, sizeof(msg.content) + sizeof(msg.title), mtype, 0); // 接收消息
printf("接收到的数据(%ld)\n类型(%ld)\n内容(%s)\n标题(%s)\n", len, msg.mType, msg.content, msg.title); // 打印消息
return 0;
}
/*
使用说明,配合 msgque2_sender.c (sender) 使用:
1. 编译 msgque2_sender.c (sender) 和 msgque3_receiver.c (receiver)
2. 运行 msgque2_sender.c (sender) 发送消息
3. 运行 msgque3_receiver.c (receiver) 接收消息
使用时:
./receiver <type>
type 是消息类型,必须是整数,必须大于 0
当 type 为 -5 时,接收到的消息是类型小于 5 的消息
当 type 为 1 时,接收到的消息是类型为 1 的消息
当 type 为 0 时,接收到的消息是类型为最小的消息
ipcs -q 可以查看消息队列
ipcrm -q <msqid> 可以删除消息队列
*/