0513_IO7

练习1:

     使用消息队列实现的2个终端之间的互相聊天 并使用信号控制消息队列的读取方式: 当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取,读取其他所有编号的消息

//聊天一号机位
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
//定义结构体
struct msgbuf{long mtype;char mtext[128];
};
int msgid;
int signal_l=0;//ctrl+c改变的变量信息编号
int s=0;//用来判断切换回去的变量
void handle(int sig){if(s==0){signal_l=020000;s=1;}else if(s!=0){signal_l=0;s=0;}
}
//用于读取的线程
void *ltread(void *arg){signal(SIGINT,handle);struct msgbuf rbuf;while(1){memset(&rbuf,0,sizeof(rbuf));//初始化结构体msgrcv(msgid,&rbuf,128,2,signal_l);//读取消息队列中的消息printf("读取到的消息为%s\n",rbuf.mtext);}
}                                                                                                                                                                      
int main(int argc, const char *argv[])
{//调用函数ftok,获取访问同一个消息队列的秘钥key_t key;if((key=ftok("liantianle",100))==EOF){perror("ftok");return -1;}//根据秘钥创建消息队列/根据秘钥访问一个已经存在的消息队列if((msgid=msgget(key,IPC_CREAT|0666))==EOF){perror("msgget");return -1;}//创建并运行一个线程pthread_t thread;if((thread=pthread_create(&thread,NULL,ltread,NULL))!=0){perror("pthread_create");return -1;}struct msgbuf wbuf;signal(SIGINT,SIG_IGN);while(1){memset(&wbuf,0,sizeof(wbuf));//初始化结构体wbuf.mtype=1;//确定消息编号printf("1号输入:");fgets(wbuf.mtext,128,stdin);//直接读取终端输入,避免了scanf不吸收空格的影响msgsnd(msgid,&wbuf,strlen(wbuf.mtext),0);//将消息写入消息队列,以阻塞的形式}return 0;
}// 聊天2号机位                                                                                                                                                                  
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
//定义结构体
struct msgbuf{long mtype;char mtext[128];
};
int msgid;
int signal_l=0;//ctrl+c改变的变量信息编号
int s=0;//用来判断切换回去的变量
void handle(int sig){if(s==0){signal_l=020000;s=1;}else if(s!=0){signal_l=0;s=0;}                                                                                                                                                                                                                                                     
}
//用于读取的线程
void *ltread(void *arg){signal(SIGINT,handle);struct msgbuf rbuf;while(1){memset(&rbuf,0,sizeof(rbuf));//初始化结构体msgrcv(msgid,&rbuf,128,1,signal_l);//读取消息队列中的消息printf("读取到的消息为%s\n",rbuf.mtext);}
}
int main(int argc, const char *argv[])
{//调用函数ftok,获取访问同一个消息队列的秘钥key_t key;if((key=ftok("liantianle",100))==EOF){perror("ftok");return -1;}//根据秘钥创建消息队列/根据秘钥访问一个已经存在的消息队列if((msgid=msgget(key,IPC_CREAT|0666))==EOF){perror("msgget");return -1;}//创建并运行一个线程pthread_t thread;if((thread=pthread_create(&thread,NULL,ltread,NULL))!=0){perror("pthread_create");return -1;}struct msgbuf wbuf;signal(SIGINT,SIG_IGN);while(1){memset(&wbuf,0,sizeof(wbuf));//初始化结构体wbuf.mtype=2;//确定消息编号printf("2号输入:");fgets(wbuf.mtext,128,stdin);//直接读取终端输入,避免了scanf不吸收空格的影响msgsnd(msgid,&wbuf,strlen(wbuf.mtext),0);//将消息写入消息队列,以阻塞的形式}return 0;
}

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

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

相关文章

孩子多大可以接触python?学习python的好处

孩子接触Python的年龄并没有明确的界限&#xff0c;一般来说&#xff0c;6岁以上的孩子可以开始学习Python编程。虽然Python是一门高级编程语言&#xff0c;但它的语法简单易懂&#xff0c;适合初学者入门。通过学习Python编程&#xff0c;孩子可以培养逻辑思维、创造力和解决问…

电商秒杀系统设计

业务流程 系统架构 系统挑战 高并发:秒杀活动会在短时间内吸引大量用户,系统需要能够处理高峰时期的大量并发请求 库存同步:在秒杀中,面临的一个严重系统挑战是如何确保在数以万计的用户同时抢购有限的商品时,如何正确、实时地扣减库存,以防止超卖现象。 防止恶意抢购和…

前端 JS 经典:JS 基础类型和 typeof

前言&#xff1a;JS 基础类型就 8 种&#xff0c;这是官方确定的&#xff0c;毋庸置疑。其中原始类型 7 种&#xff0c;对象类型 1 种。而 typeof 关键字是用来判断数据是属于什么类型的。 1. 原始类型 Number、Boolean、String、BigInt、symbol、Undefined、null typeof 18…

猫头虎分享已解决Error || ERROR: Failed building wheel for XXX

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

python设计模式---观察者模式

观察者模式是一种行为设计模式&#xff0c;用于定义对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都会得到通知并自动更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…

系统定时器(SysTick)

介绍SysTick SysTick结构框图 时钟选择 计数器部分 中断部分 工作流程 相关寄存器 配置流程 相关库函数

centos无法tab补全至文件

很奇怪的需求&#xff1a;redhat 7.9版本用cd 只能到目录&#xff0c;无法到文件 我个人认为不是个问题&#xff0c;但是甲方需求&#xff0c;你懂的 首先&#xff0c;我们要搞清楚tab补全功能的包bash-completion是否安装&#xff0c;这里肯定是安装了&#xff0c;不过还是看…

使用vscode时快速生成console.log()

前言&#xff1a;在使用vscode开发进行调试时&#xff0c;我们经常要用到console.log()来调试代码&#xff0c;有什么好用的办法来快速生成&#xff0c;答案肯定是有的&#xff0c;下面跟随我来看一下是不是真的很好用。 安装插件JavaScript (ES6) code snippets 使用时直接按照…

Python批量输出图像的尺寸、格式、模式代码

import os from PIL import Image # 原始文件夹路径 original_folder rC:\Users\86182\Desktop\OPENCVyt\yt1 # 遍历原始文件夹中的图像 for filename in os.listdir(original_folder): img Image.open(os.path.join(original_folder, filename)) Size img.size # …

你了解手机设备的dpr吗?它和CSS又有什么联系?

当我们在前端开发中涉及到devicePixelRatio时&#xff0c;我们实际上在谈论屏幕像素密度&#xff0c;即每英寸的像素数。这个属性告诉我们在一个设备上的一个CSS像素对应多少物理像素。 目录 知识点概览 dpr值的计算 dpr的用处 知识点概览 比如我们新买了一个手机&#xff0…

vue vite 环境非构建包编译 React 报错定位

1. 背景 众所周知&#xff0c;vite 在构建生态的位置&#xff0c;vue 与之更是密切&#xff0c;主流的 vue 库几乎都与 vite 捆绑。 但有些 UI 库 如 private/ui 并没进行行编译&#xff0c;而是直接将源码发布到了 npm 中&#xff0c;无法实现兼容化&#xff0c;需要消费方去…

vs-qt中无法加载qsqlite驱动,但是单独新建demo测试却又是正常的。。。

开发环境: Vs2015 + qt5.12 背景: 接手了一个项目,可以编译过去,也可以运行,, 但是登录一直失败,,但是数据库文件也是正常的。。。 最主要的是环境和同事的是一样的,,,但是他那边可以加载成功,我这边不可以。。 后来单独在vs中创建了一个demo,用来测试QSqlData…

Ubuntu虚拟机上推荐一款免费好用的git版本管理工具

工具叫: gitg 软件界面如下&#xff1a; FR:徐海涛(hunkxu)

开眼了,自动化测试还能这样用?

持续集成的自动化测试通常需要将代码、测试用例与持续集成工具进行绑定&#xff0c;以实现自动运行。然而&#xff0c;Apipost的自动化测试功能需要手动操作&#xff0c;并且需要手动查看测试结果。 为了解决这个问题&#xff0c;Apipost推出了持续集成功能&#xff0c;方便同…

【Shell】正则表达式的操作实例

正则表达式是一个描述一组字符串的模式 是由普通字符和元字符组成的字符集&#xff0c;而这个字符集匹配&#xff08;或指定&#xff09;一个模式。 正则表达式的操作实例 &#xff08;一&#xff09;概述1.定义2.作用3.类型 &#xff08;二&#xff09;字符串匹配实例&#xf…

【论文阅读】Machine Learning, Linear Algebra, and More: Is SQL All You Need?

文章目录 摘要一、介绍二、SQL算法原语2.1、Variables2.2、Functions2.3、Conditions2.4、Loops2.5、Errors 三、案例研究3.1、对数据库友好的SQL映射3.2、性能结果 四、结论以及未来工作 摘要 尽管SQL在简单的分析查询中无处不在&#xff0c;但它很少用于更复杂的计算&#xf…

文件流-ASCII文件(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 编写程序实现以下功能&#xff1a;【要求处理ASCII文件】 &#xff08;1&#xff09;按职工号由小到大的顺序将5个员工的数据&#xff08;包括号码、姓名、年龄和工资&#xff09;输出到磁盘文件中保存&#xff1b; &#xff08;2&#xff…

自动驾驶决策规划——坐标转换

以下内容来自b站up主忠厚老实的老王&#xff0c;视频链接&#xff1a;自动驾驶决策规划算法序章 总纲与大致目录_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1hP4y1p7es/?spm_id_from333.999.0.0&vd_sourced36e625f376908cfa88ef5ecf2fb0ed8侵删。 决策规划算法…

自动故障转移

这里询问&#xff0c;你的插槽是从哪里移动过来的&#xff1f; all&#xff1a;代表全部&#xff0c;也就是三个节点各转移一部分具体的id&#xff1a;目标节点的iddone&#xff1a;没有了 这里我们要从7001获取&#xff0c;因此填写7001的id&#xff1a; 填完后&#xff0c;…

02-登录页面、动态路由、权限等模块开发

权限模块开发流程 前端login页面开发后端SpringSecurity配置后端login接口开发前端页面框架搭建前端路由守卫&#xff0c;状态管理开发前后端完成认证流程 开发Login页面 创建Login页面创建router&#xff0c;可以跳转到Login页面 Login页面 使用element-plus开发 认证功…