2024.2.23

1、消息队列代码

msgsnd.c
#include<myhead.h>
//定义一个消息类型
struct msgbuf
{long mtype;           //消息类型char mtext[1024];     //消息正文
};//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//定义一个key值key_t key = 0;if((key=ftok("/",'k')) == -1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);//根据key值创建一个消息队列int msqid = -1;if((msqid=msgget(key,IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);//定义一个消息struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));//输入消息类型 printf("please enter the type of message:");scanf("%ld",&sbuf.mtype);getchar();//输入消息的内容printf("please enter the text of message:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);sbuf.mtext[strlen(sbuf.mtext)-1] = 0;//将消息存放到队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("send success\n");if(strcmp(sbuf.mtext,"quit")==0)break;}return 0;
}
msgrcv.c
#include<myhead.h>
//定义一个消息类型
struct msgbuf
{long mtype;         //消息类型char mtext[1024];   //消息正文
};
//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//1、创建key值key_t key = 0;if((key=ftok("/",'k'))== -1 ){perror("ftok error");return -1;}//2、根据key值创建一个消息队列int msqid = -1;if((msqid=msgget(key,IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);//定义一个消息struct msgbuf rbuf;while(1){//清空容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息列表中读取一个消息msgrcv(msqid,&rbuf,MSGSIZE,0,0);printf("the massage receive:%s\n",rbuf.mtext);if(strcmp(rbuf.mtext,"quit")==0)break;}//将消息队列删除if(msgctl(msqid,IPC_RMID,NULL) != 0){perror("msgclt error");return -1;}return 0;
}

2、使用消息队列完成两个进程间相互通信

send.c
#include<myhead.h>
//定义一个消息
struct msgbuf
{long mtype;         //消息类型char mtext[1024];   //消息正文内容
};//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//定义一个key值key_t key=0;if((key=ftok("/",'k')) == -1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);//根据Key值创建一个消息队列int msqid = -1;if((msqid=msgget(key,IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}//定义一个消息struct msgbuf sbuf;struct msgbuf rbuf;//创建一个进程pid_t pid=fork();if(pid > 0){//父进程while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));//输入消息类型printf("please enter the type of message:");scanf("%ld",&sbuf.mtype);getchar();//输入消息的内容printf("请输入消息的内容:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);sbuf.mtext[strlen(sbuf.mtext)-1] = 0;//将消息存放到队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("send success\n");if(strcmp(sbuf.mtext,"quit") == 0)break;}wait(NULL);}else if(pid == 0){while(1){//清空容器bzero(rbuf.mtext, sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid, &rbuf, MSGSIZE, 0, 0);//第一个0:表示一直读取队列中第一个消息//第二个0:表示阻塞读取msgrcv(msqid, &rbuf, MSGSIZE, 2, 0);  //只接收类型为1printf("\n收到消息为:%s\n", rbuf.mtext);if(strcmp(rbuf.mtext, "quit") == 0);break;}exit(EXIT_SUCCESS);          //退出进程}else{perror("fork error");return -1;}return 0;
}recevie.c
#include<myhead.h>
//定义一个消息
struct msgbuf
{long mtype;         //消息类型char mtext[1024];   //消息正文内容
};//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//定义一个key值key_t key=0;if((key=ftok("/",'k')) == -1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);//根据Key值创建一个消息队列int msqid = -1;if((msqid=msgget(key,IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}//定义一个消息struct msgbuf sbuf;struct msgbuf rbuf;//创建一个进程pid_t pid=fork();if(pid > 0){//父进程while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));//输入消息类型printf("please enter the type of message:");scanf("%ld",&sbuf.mtype);getchar();//输入消息的内容printf("请输入消息的内容:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);sbuf.mtext[strlen(sbuf.mtext)-1] = 0;//将消息存放到队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("send success\n");if(strcmp(sbuf.mtext,"quit") == 0)break;}wait(NULL);}else if(pid == 0){while(1){//清空容器bzero(rbuf.mtext, sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid, &rbuf, MSGSIZE, 0, 0);//第一个0:表示一直读取队列中第一个消息//第二个0:表示阻塞读取msgrcv(msqid, &rbuf, MSGSIZE, 1, 0);  //只接收类型为1printf("\n收到消息为:%s\n", rbuf.mtext);if(strcmp(rbuf.mtext, "quit") == 0);break;}exit(EXIT_SUCCESS);          //退出进程}else{perror("fork error");return -1;}return 0;
}

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

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

相关文章

Docker容器故障排查与解决方案

Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&#xff1a; 1、通过docker run执行命令&#xff0c;或许返回信息 2、通过docker logs 去获取日志&#xff0c;做有针对性的筛选 3、通过systemctl status docker查看docker服务状态 4、通过…

数据安全治理实践路线(上)

基于以上数据安全治理实践理念&#xff0c;可以按照自顶向下和自底向上相结合的思路推进实践过程。一方面&#xff0c;组织自顶向下,以数据安全战略规划为指导,以规划、建设、运营、优化为主线&#xff0c;围绕构建数据安全治理体系这一核心&#xff0c;从组织架构、制度流程、…

“从根到叶:深入理解排序数据结构“

一.排序的概念及引用 1.1排序的概念 排序是指将一组数据按照一定的规则重新排列的过程。排序的目的是为了使数据具有有序性&#xff0c;便于查找、插入、删除等操作&#xff0c;提高数据的组织和管理效率。 稳定性是指如果序列中存在相等元素&#xff0c;在排序完成后&#…

网卡本质,网络发展(局域网,广域网概念)

目录 引入 网卡的本质 网络的发展 引入 早期 局域网LAN&#xff08;Local Area Network&#xff09; 广域网WAN&#xff08;Wide Area Network&#xff09; 注意 引入 前面我们已经学习了很多关于linux系统的知识,其中文件系统和线程尤为繁杂 而网络其实也算系统的一部…

2024年开发者的最好选择!!没有之一

中国银河证券1月23日明确指出&#xff1a;鸿蒙应用将在2024年迎来爆发。 2024年Q2推出开发者Beta版&#xff0c;2024年Q4推出商用版。今年年终将有 5000 款应用完成原生鸿蒙开发&#xff0c;未来支持 50 万款应用。覆盖便捷生活、出行文旅、金融便利、社交资讯、生产力工具、影…

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024)

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024) 会议简介 能源动力、机械自动化和航空航天技术国际学术会议&#xff08;ICEPMAT2024&#xff09;将于2024年在北京举行。会议将探讨能源动力、机械自动化、航空航天技术领域的新研究热点、核心技术和发展趋…

【Git】:远程仓库操作

远程仓库操作 一.理解版本控制系统二.远程仓库1.克隆2.Push操作3.fetch操作4. .gitnore文件 一.理解版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者计…

Camtasia Studio2024破解版屏幕录像和视频编辑软件

Camtasia Studio是一款专业的屏幕录像和视频编辑软件&#xff0c;它可以用来进行多种工作&#xff1a; 屏幕录制&#xff1a;Camtasia Studio可以录制电脑屏幕上的任何活动&#xff0c;如软件操作、演示、游戏过程等&#xff0c;非常适合制作教学视频、软件教程、游戏解说等。…

京东前端笔试(附答案解答)

引言 我目前本科大四&#xff0c;正在春招找前端&#xff0c;有大厂内推的友友可以聊一聊&#xff0c;球球给孩子的机会吧。 我整理了一份10w字的前端技术文档&#xff1a;https://qx8wba2yxsl.feishu.cn/docx/Vb5Zdq7CGoPAsZxMLztc53E1n0k?fromfrom_copylink &#xff0c;对…

什么是汽车抛负载Load dump

1.什么是抛负载 抛负载&#xff0c;英文为Load dump&#xff0c;是指断开电源与负载的瞬间&#xff0c;由于负载突变而引起电源电压急剧变化。在汽车电子领域&#xff0c;抛负载是指在蓄电池充电时&#xff0c;断开发电机与蓄电池的连接而引起发电机输出大电压尖峰&#xff0c…

【Linux】一站式教会:Ubuntu(无UI界面)使用apache-jmeter进行压测

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Java…

EventStream获得数据流,前端配置获得推送的流

如上图所示&#xff0c;请求一个接口&#xff0c;接口以数据流的方式向客户端推送数据&#xff0c;默认需要消息收集一条&#xff0c;在原来的基础上追加&#xff0c;在create-react-app生成的工程中&#xff0c;如果代理使用了中间件http-proxy-middleware&#xff0c;同时dev…

数据库面试题汇总,助你轻松应对面试!

考虑到最近有些小伙伴准备跳槽&#xff0c;所以更新一些数据库相关的面试题&#xff0c;希望能帮到大家&#xff01; 一 请写出创建表的基本语法结构&#xff1f; 创建表的基本语法结构如下&#xff1a; CREATE TABLE IF NOT EXISTS 表名(字段名1 字段类型,字段名2 字段类型 …

在springboot中调用openai Api并实现流式响应

之前在《在springboot项目中调用openai API及我遇到的问题》这篇博客中&#xff0c;我实现了在springboot中调用openai接口&#xff0c;但是在这里的返回的信息是一次性全部返回的&#xff0c;如果返回的文字比较多&#xff0c;我们可能需要等很久。 所以需要考虑将请求接口响应…

QT_day4

1.思维导图 2. 输入闹钟时间格式是小时:分钟 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);id startTimer(1000);flag1;speecher new QTextT…

nginx 配置文件详细介绍

一&#xff0c; nginx 配置文件架构 上一篇 已对 main 全局配置做了详细介绍 本章对剩下的配置文件部分做介绍 二&#xff0c;event 设置 &#xff08;一&#xff09;event 相关的配置文件为 配置工作模式以及连接数 &#xff08;二&#xff09;具体表现 1&#xff…

c语言经典测试题3

1.题1 int a 248, b 4; int const *c 21; const int *d &a; int *const e &b; int const * const f &a; 请问下列表达式哪些会被编译器禁止&#xff1f; A: *c 32; B: *d 43 C: e&a D: f0x321f 我们来分析一下&#xff1a;const用来修饰变量是想其…

鸿蒙自定义侧滑菜单布局(DrawerLayout)

前言 为了实现安卓中的侧滑菜单布局效果&#xff0c;通过查找鸿蒙的布局控件&#xff0c;发现SideBarContainer控件有点像&#xff0c;但是使用中发现并不是很符合我们的UI交互效果&#xff0c;因此我在鸿蒙中通过自定义布局的方式实现&#xff0c;本文主要介绍该自定义控件如…

kubernetes负载均衡部署

目录 1.新master节点的搭建 对master02进行初始化配置&#xff08;192.168.88.31&#xff09; 将master01的配置移植到master02 修改master02配置文件 2.负载均衡的部署 两台负载均衡器配置nginx 部署keepalived服务 所有node节点操作 总结 实验准备&#xff1a; k8s…

Vue3的computed计算属性和watch监视(四)

一、computed计算属性 <template><div class"person">姓:<input type"text" v-model"first_name"><br>名:<input type"text" v-model"last_name"><br><button click"changeFu…