寒假(一)

请使用消息队列实现2个终端之间互相聊天

终端一

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>#define MSG_SIZE 64
#define MSG_TYPE_1 1
#define MSG_TYPE_2 2typedef struct {long change;       // 消息类型(频道)char dup[MSG_SIZE]; // 消息内容
} msg_data;key_t key;      // 消息队列的键值
int msg_id;     // 消息队列的ID// 信号处理函数
void handler(int signum) {if (signum == SIGINT) {printf("\n程序退出,销毁消息队列...\n");msgctl(msg_id, IPC_RMID, NULL); // 销毁消息队列exit(0);}
}// 消息写入函数
void msg_w() {msg_data arr;while (1) {arr.change = MSG_TYPE_1; // 设置消息类型printf("请输入:");scanf("%s", arr.dup);    // 读取用户输入if (msgsnd(msg_id, &arr, strlen(arr.dup) + 1, 0) == -1) {perror("msgsnd");break;}}
}// 消息读取函数
void msg_r() {msg_data arr;while (1) {if (msgrcv(msg_id, &arr, sizeof(arr.dup), MSG_TYPE_2, 0) == -1) {perror("msgrcv");break;}printf("\b\b\b\b\b\b\b\b收到的消息为:%s\n", arr.dup);memset(arr.dup, 0, sizeof(arr.dup)); // 清空消息缓冲区}
}// 线程函数
void* pthread_main(void* arg) {msg_w();return NULL;
}// 清理函数
void cleanup() {printf("清理消息队列...\n");msgctl(msg_id, IPC_RMID, NULL);
}int main(int argc, const char *argv[]) {pthread_t pthread_id;// 注册信号处理函数signal(SIGINT, handler);// 注册清理函数atexit(cleanup);// 生成消息队列的键值key = ftok("1.txt", 1);if (key == -1) {perror("ftok");exit(1);}// 创建消息队列msg_id = msgget(key, IPC_CREAT | 0664);if (msg_id == -1) {perror("msgget");exit(1);}// 创建线程if (pthread_create(&pthread_id, NULL, pthread_main, NULL) != 0) {perror("pthread_create");exit(1);}pthread_detach(pthread_id); // 设置线程为分离状态// 主线程负责读取消息msg_r();return 0;
}

终端二

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <signal.h>
#include <pthread.h>#define MSG_TYPE_SEND 1   // 本终端发送的消息类型
#define MSG_TYPE_RECV 2   // 本终端接收的消息类型
#define MSG_BUFFER_SIZE 64
#define KEY_FILE_PATH "msgq_chat.key"
#define PROJECT_ID 12345typedef struct {long mtype;            // 消息类型char mtext[MSG_BUFFER_SIZE]; // 消息内容
} msg_data;static int msg_id = -1;// 信号处理函数:清理消息队列
void handle_signal(int signum) {if (signum == SIGINT) {printf("\n正在清理消息队列...\n");if (msg_id != -1) {msgctl(msg_id, IPC_RMID, NULL);}exit(EXIT_SUCCESS);}
}// 消息发送线程函数
void* send_thread(void *arg) {msg_data msg;while (1) {msg.mtype = MSG_TYPE_SEND;printf("[You] > ");if (fgets(msg.mtext, MSG_BUFFER_SIZE, stdin) == NULL) {perror("fgets");break;}// 去除换行符并计算真实长度size_t len = strcspn(msg.mtext, "\n");msg.mtext[len] = '\0';if (msgsnd(msg_id, &msg, len + 1, IPC_NOWAIT) == -1) { // 非阻塞发送perror("消息发送失败");usleep(100000); // 发送失败时等待100ms}}return NULL;
}// 消息接收处理
void receive_messages() {msg_data msg;while (1) {ssize_t ret = msgrcv(msg_id, &msg, MSG_BUFFER_SIZE, MSG_TYPE_RECV, 0);if (ret == -1) {perror("消息接收失败");break;}printf("\r[Other] > %s\n[You] > ", msg.mtext);fflush(stdout); // 确保立即刷新输出}
}int main() {// 生成唯一Keykey_t key = ftok(KEY_FILE_PATH, PROJECT_ID);if (key == -1) {perror("无法生成消息队列Key");exit(EXIT_FAILURE);}// 创建/获取消息队列msg_id = msgget(key, IPC_CREAT | 0666);if (msg_id == -1) {perror("无法创建消息队列");exit(EXIT_FAILURE);}// 注册信号处理signal(SIGINT, handle_signal);// 创建发送线程pthread_t tid;if (pthread_create(&tid, NULL, send_thread, NULL) != 0) {perror("无法创建发送线程");exit(EXIT_FAILURE);}pthread_detach(tid);// 主线程处理接收printf("--- 聊天室已启动 (Ctrl+C退出) ---\n");receive_messages();return EXIT_SUCCESS;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目验证码登录

1.依赖 导入hutool工具包用于创建验证码 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency> 2.测试 生成一个验证码图片&#xff08;生成的图片浏览器可…

BUU14 [极客大挑战 2019]PHP1

用dirsearch扫描文件&#xff0c;扫了一万年什么也没扫出来 从网上看的wp&#xff0c;他们扫出来www.zip 这里直接用上了&#xff0c;以后有空再扫一遍 下载www.zip 在index.php中 说明要输入select 打开class.php <?php include flag.php;error_reporting(0);class…

20250202在Ubuntu22.04下使用Guvcview录像的时候降噪

20250202在Ubuntu22.04下使用Guvcview录像的时候降噪 2025/2/2 21:25 声卡&#xff1a;笔记本电脑的摄像头自带的【USB接口的】麦克风。没有外接3.5mm接口的耳机。 缘起&#xff1a;在安装Ubuntu18.04/20.04系统的笔记本电脑中直接使用Guvcview录像的时候底噪很大&#xff01; …

蓝桥杯思维训练营(三)

文章目录 题目详解680.验证回文串 II30.魔塔游戏徒步旅行中的补给问题观光景点组合得分问题 题目详解 680.验证回文串 II 680.验证回文串 II 思路分析&#xff1a;这个题目的关键就是&#xff0c;按照正常来判断对应位置是否相等&#xff0c;如果不相等&#xff0c;那么就判…

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文&#xff08;1&#xff09;内置数…

密码学的数学基础1-素数和RSA加密

数学公式推导是密码学的基础, 故开一个新的课题 – 密码学的数学基础系列 素数 / 质数 质数又称素数。 一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff0…

音视频入门基础:RTP专题(7)——RTP协议简介

一、引言 本文对RTP协议进行简介。在简介之前&#xff0c;请各位先下载RTP的官方文档《RFC 3550》和《RFC 3551》。《RFC 3550》总共有89页&#xff0c;《RFC 3551》总共有44页。本文下面所说的“页数”是指在pdf阅读器中显示的页数&#xff1a; 二、RTP协议简介 根据《RFC 35…

半导体器件与物理篇7 微波二极管、量子效应和热电子器件

基本微波技术 微波频率&#xff1a;微波频率涵盖约从0.1GHz到3000GHz&#xff0c;相当于波长从300cm到0.01cm。 分布效应&#xff1a;电子部件在微波频率&#xff0c;与其在较低频率的工作行为不同。 输运线&#xff1a;一个由电阻、电容、电感三种等效基本电路部件所组成的…

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…

麦芯(MachCore)应用开发教程5 --- 工位和晶圆传输

麦芯是构建在windows系统上的设备应用操作系统&#xff0c;利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 一、工位与子设备的关系 想象工厂中的流水线工作站&#xff0c;每个工位&#xff08;Station&#xff09…

Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【C++篇】位图与布隆过滤器

目录 一&#xff0c;位图 1.1&#xff0c;位图的概念 1.2&#xff0c;位图的设计与实现 1.5&#xff0c;位图的应用举例 1.4&#xff0c;位图常用应用场景 二&#xff0c;布隆过滤器 2.1&#xff0c;定义&#xff1a; 2.2&#xff0c;布隆过滤器的实现 2.3&#xff0c; 应…

VR触感数据手套:触感反馈赋予虚拟交互沉浸式体验

随着动作捕捉技术的蓬勃发展&#xff0c;动捕数据手套成为了手部动作捕捉与虚拟交互的便捷工具&#xff0c;为人们打开了通往虚拟世界的新大门。在众多产品中&#xff0c;mHand Pro作为一款多功能兼具的VR动作捕捉数据手套&#xff0c;凭借其卓越的性能&#xff0c;在手部动作捕…

追逐低空经济,无人机研学技术详解

追逐低空经济&#xff0c;无人机研学技术成为了一个备受关注的领域。以下是对无人机研学技术的详细解析&#xff1a; 一、无人机研学技术概述 无人机研学技术是以无人机为核心&#xff0c;结合航空科技、电子技术、机械原理等多领域知识的一种教育实践活动。它旨在通过理论学习…

(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编&#xff0c;编译后链接即可) 任务1&#xff1a;Uthread: switching between threads (完成) 在这个练习中&#xff0c;你将设计一个用户级线程系统中的上下文切…

Kubernetes学习之通过Service访问Pod

一、基础概述 1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址&#xff0c;当controller用新的pod替代发生故障的pod时&#xff0c;新的pod会分配到新的ip地址&#xff0c;那么客户端如何稳定的找到并访问pod提供的服务。 2.创建service service从…

【优先算法】专题——前缀和

目录 一、【模版】前缀和 参考代码&#xff1a; 二、【模版】 二维前缀和 参考代码&#xff1a; 三、寻找数组的中心下标 参考代码&#xff1a; 四、除自身以外数组的乘积 参考代码&#xff1a; 五、和为K的子数组 参考代码&#xff1a; 六、和可被K整除的子数组 参…

CDDIS从2025年2月开始数据迁移

CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov&#xff0c;并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。

谷歌Titans模型论文解析,Transformer迎来变革拐点——DeepSeek能否“接招”?

一、引入 Titans 模型 我们将深入探讨谷歌研究院的一篇新论文《Titans: Learning to Memorize at Test Time》&#xff0c;该论文介绍了一种名为 Titans 的新模型架构。 Titans 在缓解 Transformer 二次方成本问题的同时&#xff0c;展现出了令人期待的成果。Titans 模型的设…