From e6757b9935a4a880c458a12b2e7cf2f6ccf69636 Mon Sep 17 00:00:00 2001 From: flykhan Date: Fri, 18 Aug 2023 15:05:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97:=20?= =?UTF-8?q?=E5=8F=91=E9=80=81=E8=80=85=E6=8E=A5=E5=8F=97=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day5/rec_sed/msgque2_sender.c | 90 ++++++++++++++++++++++++++++++++ day5/rec_sed/msgque3_receiver.c | 62 ++++++++++++++++++++++ day5/rec_sed/receiver | Bin 0 -> 8920 bytes day5/rec_sed/send | Bin 0 -> 9024 bytes 4 files changed, 152 insertions(+) create mode 100644 day5/rec_sed/msgque2_sender.c create mode 100644 day5/rec_sed/msgque3_receiver.c create mode 100755 day5/rec_sed/receiver create mode 100755 day5/rec_sed/send diff --git a/day5/rec_sed/msgque2_sender.c b/day5/rec_sed/msgque2_sender.c new file mode 100644 index 0000000..3a671cc --- /dev/null +++ b/day5/rec_sed/msgque2_sender.c @@ -0,0 +1,90 @@ +#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 != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + + key_t key = ftok("/", 200); // 获取消息队列的键值 + + // msgget 函数用于创建消息队列,参数1是键值,参数2是权限 + // 返回值是消息队列的标识符,类似于文件描述符 + // IPC_CREAT 表示如果消息队列不存在则创建,如果存在则打开 + // 0644 表示权限,类似于文件权限,表示所有者可读写,其他人只读 + int msgqid = msgget(key, IPC_CREAT | 0666); // 创建消息队列 + if (msgqid == -1) + { + perror("msgget"); + return 1; + } + + // msgqid 只要不是 -1 就表示创建成功 + printf("msgqid = %d\n", msgqid); // 打印消息队列标识符 + + // 发送消息 + // 1 表示类型,表示发送消息的类型,必须大于 0 + // MSG msg1 = {1, "测试消息队列的发送函数 msgsnd", "测试"}; // 消息内容 + + MSG msg1; + msg1.mType = atol(argv[1]); // 消息类型 + strcpy(msg1.content, argv[2]); // 消息内容 + strcpy(msg1.title, argv[3]); // 消息标题 + + // 参数 4 表示阻塞,如果消息队列满了,发送消息的进程会阻塞 + // 非阻塞的话,消息队列满了,发送消息的进程会立即返回,不会阻塞 + // int ret = msgsnd(msgqid, &msg1, sizeof(msg1.content), 0); // 发送消息 + int ret = msgsnd(msgqid, &msg1, sizeof(msg1.content) + sizeof(msg1.title), IPC_NOWAIT); // 发送消息 + if (ret == -1) + { + perror("msgsnd"); + return 1; + } + printf("msg1 发送成功\n"); + + return 0; +} + +/* + ipc: inter process communication 进程间通信 + + ipcs -q // 查看消息队列 + ipcrm -q <msqid> // 删除消息队列 +*/ + +/* + ipc 通信方式 + 1. 管道 + 2. 消息队列 + 3. 共享内存 + 4. 信号量 + 5. 套接字 +*/ + +/* + 使用说明,配合 msgque3_receiver.c (receiver) 使用: + 1. 编译 msgque2_sender.c (sender) 和 msgque3_receiver.c (receiver) + 2. 运行 msgque2_sender.c (sender) 发送消息 + 3. 运行 msgque3_receiver.c (receiver) 接收消息 + + ipcs -q 可以查看消息队列 + ipcrm -q <msqid> 可以删除消息队列 +*/ \ No newline at end of file diff --git a/day5/rec_sed/msgque3_receiver.c b/day5/rec_sed/msgque3_receiver.c new file mode 100644 index 0000000..7c953b2 --- /dev/null +++ b/day5/rec_sed/msgque3_receiver.c @@ -0,0 +1,62 @@ +#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> 可以删除消息队列 +*/ \ No newline at end of file diff --git a/day5/rec_sed/receiver b/day5/rec_sed/receiver new file mode 100755 index 0000000000000000000000000000000000000000..f1a0275b370a08b02775267aa29a91225a33e409 GIT binary patch literal 8920 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 literal 0 HcmV?d00001 diff --git a/day5/rec_sed/send b/day5/rec_sed/send new file mode 100755 index 0000000000000000000000000000000000000000..ab35279fbad0ab6ff7c497ebd9d905517ee25e73 GIT binary patch literal 9024 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 T8K+sc@+ZZG-zyI1&hq~QrPha+ literal 0 HcmV?d00001