IO进程线程Day8

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

#include <myhead.h>
//使用消息队列实现两个进程的相互聊天
#define ERR_MSG(msg)  do{fprintf(stderr,"__%d__",__LINE__);\perror(msg);\}while(0)
int msgid;
typedef struct{long mtype;char text[256];
}msg_t;void *rtask(void *arg){msg_t buf;long rtype=*((long *)arg);while(1){memset(buf.text,0,sizeof(buf.text));if(msgrcv(msgid,&buf,sizeof(buf.text),rtype,0)<0){ERR_MSG("msgrcv");break;}if(0==strcmp(buf.text,"quit")){printf("user2 offline\n");break;}printf("\033[8Duser2:%s\n",buf.text);printf("请输入:");fflush(stdout);}pthread_exit(NULL);
}void *wtask(void *arg){msg_t buf;long wtype=*((long *)arg);buf.mtype=wtype;while(1){memset(buf.text,0,sizeof(buf.text));printf("请输入:");fgets(buf.text,sizeof(buf.text),stdin);buf.text[strlen(buf.text)-1]='\0';if(msgsnd(msgid,&buf,sizeof(buf.text),0)<0){ERR_MSG("msgsnd");break;}if(0==strcmp(buf.text,"quit")){printf("user1 offline\n");break;                                                     }}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建秘钥key_t key=ftok("/",19);if(key<0){ERR_MSG("ftok");return -1;}//创建消息队列msgid=msgget(key,IPC_CREAT|0664);if(msgid<0){ERR_MSG("msgget");return -1;}long rtype=1;long wtype=2;pthread_t rtid,wtid;if(pthread_create(&rtid,NULL,rtask,&rtype)!=0){ERR_MSG("rtask");return -1;}if(pthread_create(&wtid,NULL,wtask,&wtype)!=0){ERR_MSG("wtask");return -1;}pthread_join(rtid,NULL);pthread_join(wtid,NULL);//删除消息队列msgctl(msgid,IPC_RMID,0);return 0;
}

让2个终端之间互相聊天使用共享内存 + 信号灯集去实现

#include <myhead.h>
//使用共享内存和信号灯集实现两个进程聊天#define ERR_MSG(msg) do{fprintf(stderr,"__%d__",__LINE__);\perror(msg);\}while(0)
typedef struct{char buf[256];
}shm_t;void semwait(int semid,int sem_num){struct sembuf buf;buf.sem_num=sem_num;buf.sem_op=-1;buf.sem_flg=SEM_UNDO;semop(semid,&buf,1);
}
void sempost(int semid,int sem_num){struct sembuf buf;buf.sem_num=sem_num;buf.sem_op=1;buf.sem_flg=SEM_UNDO;semop(semid,&buf,1);
}
shm_t *addr;
int semid;
int shmid;
void sighandler(int signal){if(SIGCHLD==signal){while(waitpid(-1,NULL,0)>0);//删除共享内存的映射shmdt(addr);//删除共享内存shmctl(shmid,IPC_RMID,0);//删除信号灯集semctl(semid,0,IPC_RMID,0);exit(0);}
}int main(int argc, const char *argv[])
{//创建秘钥key_t key=ftok("/",7);if(key<0){ERR_MSG("ftok");return -1;}//创建共享内存shmid=shmget(key,sizeof(shm_t),IPC_CREAT|0664);if(shmid<0){ERR_MSG("shmget");return -1;}//将共享内存映射到进程的内存空间addr=shmat(shmid,NULL,0);if(addr==(void*)-1){ERR_MSG("shmat");return -1;}//创建信号灯集semid=semget(key,4,IPC_CREAT|0664);if(semid<0){ERR_MSG("semget");return -1;}//初始化信号灯集if(semctl(semid,0,SETVAL,1)<0){ERR_MSG("semctl");return -1;}if(semctl(semid,2,SETVAL,0)<0){ERR_MSG("semctl");return -1;}pid_t pid=fork();if(pid>0){//user1发送while(1){signal(SIGCHLD,sighandler);semwait(semid,0);memset(addr->buf,0,sizeof(addr->buf));printf("请输入:");fgets(addr->buf,sizeof(addr->buf),stdin);addr->buf[strlen(addr->buf)-1]='\0';sempost(semid,2);if(0==strcmp(addr->buf,"quit")){printf("user1 offline\n");break;}}exit(0);}else if(0==pid){//user1接收while(1){semwait(semid,3);if(0==strcmp(addr->buf,"quit")){printf("user2 offline\n");break;}printf("\033[8Duesr2:%s\n",addr->buf);printf("请输入:");fflush(stdout);memset(addr->buf,0,sizeof(addr->buf));sempost(semid,1);}exit(0);}else{ERR_MSG("fork");return -1;}return 0;
}

 

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

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

相关文章

Quasi-Direct Drive for Low-Cost Compliant Robotic Manipulation翻译

文章目录 标题摘要I. 引言A. 问题定义和用户需求B. 定义有用的机器人操控器C. 定义有用的带宽和载荷D. 低成本设计约束 II. 相关工作A. 机器人系统中的柔顺性B. 人类载荷下的力控制机械臂C. 现有的低成本机械臂D. 驱动方案 III. 低成本柔顺操控的设计A. 准直驱驱动B. 差分齿带传…

spikingjelly学习-训练网络

【MNIST数据集包含若干尺寸为28*28的8位灰度图像&#xff0c;总共有0~9共10个类别。以MNIST的分类为例&#xff0c;一个简单的单层ANN网络如下 我们也可以用完全类似结构的SNN来进行分类任务。就这个网络而言&#xff0c;只需要先去掉所有的激活函数&#xff0c;再将尖峰神经元…

IDEA 2024.1到底更新啥有用的?

0 关键亮点 全行代码补全 Ultimate IntelliJ IDEA Ultimate 2024.1 针对 Java 全行代码补全。 这项功能由无缝集成到 IDE 中的高级深度学习模型提供支持。 它可以基于上下文分析预测和建议整行代码&#xff0c;有助于提高编码效率。 这些建议由针对不同语言和框架特别训练的专…

UML学习

UML(Unified Modeling Language)&#xff1a;统一建模语言&#xff0c;提供了一套符号和规则来帮助分析师和设计师表达系统的架构、行为和交互 类图&#xff1a;描绘类、接口之间的关系(继承、实现、关联、依赖等)以及类的内部结构(属性和方法)&#xff0c;直观展现系统的静态…

水资源管理系统:守护生命之源,构建和谐水生态

水资源是维系地球生态平衡和人类社会可持续发展的重要基础。然而&#xff0c;随着人口增长、工业化和城市化的加速&#xff0c;水资源短缺、水质污染和生态破坏等问题日益凸显。在这样的背景下&#xff0c;构建一个全面、高效、智能的水资源管理系统显得尤为迫切和必要。 项目…

AI智能客服机器人是什么?对企业重要吗?

在数字化时代&#xff0c;客户服务是企业与客户建立牢不可破关系的重要桥梁。AI智能客服机器人&#xff0c;顾名思义&#xff0c;就是利用人工智能技术提升客户服务体验的自动化工具。今天&#xff0c;就让我们来揭开AI智能客服机器人的神秘面纱&#xff0c;并讨论它对企业的重…

【C++ STL有序关联容器】map 映射

文章目录 【 1. 基本原理 】【 2. map 的创建 】2.1 调用默认构造函数&#xff0c;创建一个空的 map2.2 map 被构造的同时初始化2.3 通过一个 map 初始化另一个 map2.4 取已建 map 中指定区域内的键值对&#xff0c;初始化新的 map2.5 指定排序规则 【 2. map 元素的操作 】实例…

Bioorganic Chemistry:中国药科大学王鹏课题组、陈俊青课题组设计的基于AIE机理的高荧光选择性鉴定Cys/HCy

文献来源&#xff1a;Highly selective fluorescent probe based on AIE for identifying cysteine/homocysteine - PubMed (nih.gov) 一、AIE机理在荧光探针设计方向的应用&#xff1a; 参考文献&#xff1a;几种代表性的AIE的发光特点和机制&#xff08;2020-10-11&#xff…

PostgreSQL入门到实战-第六弹

PostgreSQL入门到实战 PostgreSQL查询语句(三)官网地址PostgreSQL概述PostgreSQL中ORDER BY理论PostgreSQL中ORDER BY实操更新计划 PostgreSQL查询语句(三) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.post…

蓝桥杯刷题--RDay5

清理水域--枚举 8.清理水域 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/2413/learning/?page1&first_category_id1&second_category_id3&tags2023 小蓝有一个n m大小的矩形水域&#xff0c;小蓝将这个水域划分为n行m列&#xff0c;行数从1…

Docker入门指南:从安装到基本操作和镜像构建的全面教程

文章目录 一、Docker简介二、Docker的安装三、Docker的基本概念四、Docker的基本操作五、Dockerfile和镜像构建六、总结 一、Docker简介 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后在任何支持Dock…

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》

​3月26日&#xff0c;人民网财经研究院与至顶科技联合发布《开启智能新时代&#xff1a;2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理&#xff0c;为政府部门、行业从业者以及社会公…

如何避免儿童校园霸凌:羊大师为您支招

校园应是学习和成长的乐土&#xff0c;而非恐惧和伤害的源泉。**在这个追求和谐社会的时代&#xff0c;校园霸凌问题依然是一个亟需解决的社会现象。羊大师作为关心儿童成长的一员&#xff0c;今天将为家长和教育工作者提供一些实用建议&#xff0c;帮助孩子避免成为校园霸凌的…

Python Selenium UI自动化测试

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

IO-DAY8

使用消息队列去实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复 A终端&#xff1a; #include<myhead.h> typedef struct msgbuf {lon…

设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

概述 本章学习状态模式。在实际的开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…

基于JAVA的汽车售票网站论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车售票信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

AI技术将影响更长远,比如未来的就业形势

随着人工智能渗透到工作场所&#xff0c;人类将需要掌握新的工作技能。 AI作为新技术已经开始扰乱就业市场了。对于最新的AI人工智能技术&#xff0c;经济学家、教育工作者、监管机构、商业分析师以及相关领域专家预测&#xff0c;在不久的将来&#xff0c;人工智能一代将需要…

AI智能调色解决方案,节省了企业的时间和人力成本

如何确保图片、视频的色彩准确、生动&#xff0c;成为企业提升品牌形象和传播效果的重要课题。美摄科技凭借领先的AI技术&#xff0c;推出全新的AI智能调色解决方案&#xff0c;以智能化、精细化的调色方式&#xff0c;帮助企业轻松驾驭色彩&#xff0c;展现视觉魅力。 美摄科…