62 lines
2.1 KiB
C
62 lines
2.1 KiB
C
|
#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> 可以删除消息队列
|
|||
|
*/
|