#include #include // 系统数据类型定义 #include // IPC相关头文件 #include // 消息队列相关头文件 #include // 字符串操作 #include // 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 \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 是消息类型,必须是整数,必须大于 0 当 type 为 -5 时,接收到的消息是类型小于 5 的消息 当 type 为 1 时,接收到的消息是类型为 1 的消息 当 type 为 0 时,接收到的消息是类型为最小的消息 ipcs -q 可以查看消息队列 ipcrm -q 可以删除消息队列 */