Linux消息队列

常用函数

//创建/获取消息队列 
int msgget (key_t key, int msgflg);
/*
key : 为键值,ftok();
msgflg:IPC_CREAT - 创建,不存在即创建,已存在即获取,除非… IPC_EXCL - 排斥,已存在即失败。
*/// 向消息队列发送消息 
int msgsnd (int msqid, const void* msgp,size_t msgsz, int msgflg);
/*
msqid : msgget()返回
msgp : 包含消息类型和消息数据的内存块.前4个字节必须是一个大于0的整数,代表消息类型,其后消息数据
msgsz:不包括消息类型的,只算消息数据的内存大小
msgflg :IPC_NOWAIT内核中的消息队列缓冲区没有足够的空闲空间时,此函数不会阻塞,而是返回-1
*///从消息队列接收消息
ssize_t msgrcv (int msqid, void* msgp, size_t msgsz,long msgtyp, int msgflg);
/*
msqid : msgget()返回
msgp : 包含消息类型和消息数据的内存块
smgsz:接收的内存大小,如果接收到的内存>smgsz,则只会截取内存大小部分
msgtyp:=0 - 返回消息队列中的第一条消息。 >0 - 若msgflg参数不包含MSG_EXCEPT位,则返回消息队列中第一个类型为msgtyp的消息,若msgflg参数包含MSG_EXCEPT位,则返回消息队列中第一个类型不为msgtyp的消息。 <0 - 返回消息队列中类型小于等于msgtyp的绝对值的消息,若有多个,则取类型最小者。
*///销毁/控制消息队列 
int msgctl (int msqid, int cmd, struct msqid_ds* buf); 
/*
IPC_STAT 
获取消息队列的属性
IPC_SET 
设置消息队列的属性
IPC_RMID - 立即删除消息队列。 此时所有阻塞在对该消息队列的,msgsnd和msgrcv函数调用,都会立即返回失败,errno为EIDRM。*/

例子

为了展示例程,部分代码删减,且多个文件合并了,开发过程中,请不要模仿,这样不规范。

server

#include "server.h"
#include "server_function.h"
#include "fileoper.h"
#include "slinklist.h"
#include <stdbool.h>
#include <signal.h>
#include <assert.h>
#include "client.h"/*typedef struct Msg{int type;char msg[1024];
}Msg;typedef struct Back{int type;char msg[1024];
}Back;*/
#define PATH "/home/zhizhen/项目/本地银行"
#define SERVER 100
#define CLIENT 101int id1 ,id2;
Slink list = NULL;
Slink node = NULL;
void myexit(int sig){file_write(list);slink_destory(list);des_msg(id1);des_msg(id2);printf("退出成功\n");exit(0);
}
int server_run(){list = slink_create();assert(list != NULL);file_read(list);int id1 = create_msg(PATH,SERVER);int id2 = create_msg(PATH,CLIENT);assert(id1 != -1 && id2 != -1);while(1){	signal(SIGINT,myexit);Msg msg = {};//后面定义的,接收的消息的结构体Back back = {};int ret = 0;size_t msgsz = 0;//接收消息ssize_t sz = recv_msg(id1,(void *)&msg,sizeof(msg.msg));assert(sz != -1);if(sz == 0){printf("该用户退出了\n");	node = NULL;}int opt = msg.type;switch(opt){case R:msgsz = recv_Reg(&msg,&back,list);break;case E:node = recv_Ent(&msg,&back,list);msgsz = sizeof(B_Ent);break;case G:msgsz = recv_GetM(&msg,&back,list,node);break;case S:msgsz = recv_SaveM(&msg,&back,list,node);break;case T:msgsz = recv_TranM(&msg,&back,list,node);break;case C:msgsz = recv_ChgP(&msg,&back,list,node);break;case D:msgsz = recv_Des(&msg,&back,list,node);break;}Slink next1 = list->next;int i = 1;while(next1 != NULL){Client *p = (Client *)(next1->elem);printf("-------------------\n");printf("*******%d*******\n",i);i++;printf("id:%s\n",p->id);printf("name:%s\n",p->name);printf("password:%s\n",p->password);printf("tel:%s\n",p->tel);printf("money:%d\n",p->money);printf("------------------\n");next1 = next1->next;}ret = send_msg(id2,(const void *)&back,msgsz);//发送反馈assert(ret != -1);}
}

client

#include "client.h"
#include <stdbool.h>
#include <assert.h>static void menu(){printf("--------%d.注册\n",R);printf("--------%d.登录\n",E);printf("--------非%d和%d即:退出\n",R,E);printf(">>>>\n");
}static void menu_Ent(){printf("******%d.取钱\n",G);printf("******%d.充值\n",S);printf("******%d.转账\n",T);printf("******%d.修改密码\n",C);printf("******%d.销户\n",D);printf("*******0.退出\n");printf(">>>>>\n");
}/*typedef struct Msg{int type;char msg[1024];
}Msg;typedef struct Back{int type;char msg[1024];
}Back;*/int create_msg(char *s,int id){key_t key = ftok(s,id);assert(key != -1);return msgget(key,IPC_CREAT|0644);
}
int send_msg(int msqid,const void *msg,size_t msgsz){return msgsnd(msqid,msg,msgsz,0);
}
int recv_msg(int msqid,void *msg,size_t msgsz){return msgrcv(msqid,msg,msgsz,0,0);
}
int des_msg(int msqid){return msgctl(msqid,IPC_RMID,NULL);
}
int client_run(){int id1 = create_msg(PATH,SERVER);int id2 = create_msg(PATH,CLIENT);assert(id1 != -1 && id2 != -1);
Beg:while(1){Msg msg = {};size_t msgsz = 0;Back back = {};int ret = 0;menu();int opt = 0;scanf("%d",&opt);switch(opt){case R:msgsz = send_Reg(&msg);break;case E:msgsz = send_Ent(&msg);break;default:printf("退出成功\n");exit(0);break;}ret = send_msg(id1,(const void *)&msg,msgsz);assert(ret != -1);ret = recv_msg(id2,(void *)&back,sizeof(back.msg));assert(ret != -1);opt = back.type;switch(opt){case R:back_Reg(&back);break;case E:{if(back_Ent(&back) == 1){while(1){menu_Ent();int opt = 0;Msg msg = {};Back back = {};size_t msgsz = 0;scanf("%d",&opt);switch(opt){case G:msgsz = send_GetM(&msg);break;case S:msgsz = send_SaveM(&msg);break;case T:msgsz = send_TranM(&msg);break;case C:msgsz = send_ChgP(&msg);break;case D:msgsz = send_Des(&msg);break;default:goto Beg;printf("退出成功!\n");break;}ret = send_msg(id1,(const void *)&msg,msgsz);assert(ret != -1);ret = recv_msg(id2,&back,sizeof(back.msg));assert(ret != -1);opt = back.type;switch(opt){case G:back_GetM(&back);break;case S:back_SaveM(&back);break;case T:back_TranM(&back);break;case C:back_ChgP(&back);break;case D:back_Des(&back);break;}}}else{printf("登录失败!\n");}break;}}}
}

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

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

相关文章

【python】OpenCV—Histogram(9)

学习参考来自 Python下opencv使用笔记&#xff08;九&#xff09;&#xff08;图像直方图&#xff09; 更多学习笔记可以参考 【python】OpenCV—RGB&#xff08;1&#xff09;【python】OpenCV—Rectangle, Circle, Selective Search&#xff08;1.2&#xff09;【python】…

Python学习从0到1 day3 python变量和debug

没关系&#xff0c;这破败的生活压不住我 ——24.1.13 一、变量的定义 1.什么是量&#xff1f; 量是程序运行中的最小单元 2.什么是变量呢&#xff1f; ①变量是存储数据的容器 ②变量存储的数据时临时的&#xff0c;变量只有在程序运行过程中是有效的&#xff0c;当程序执行结…

在vue中实现树形结构的表格,以及对数据结构的处理

需求&#xff1a;有一些告警数据&#xff0c;如果他们的计划编码相同则实现折叠效果&#xff0c;单击某行数据可以进行关闭&#xff0c;状态发生改变&#xff0c;关闭以后按钮禁用。 实现效果&#xff1a;目前所有告警消息都被关闭&#xff0c;如果未被关闭则可以进行关闭 实现…

【Python】编程练习的解密与实战(四)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1fa90;1. 初识Python &a…

集简云动作管理平台上线:创建强大且可分享的AI助手(GPTs)

OpenAI的GPT Store于昨天上线&#xff0c;用户可以找到好用的GPTs&#xff0c;也可以将自己的GPTs分享到GPT Store中。未来&#xff08;预计今年1季度&#xff09;甚至可以从GPTs Store中获取利润分成。 要创建强大的GPTs离不开调用外部的软件工具&#xff0c;比如查询CRM/ERP软…

Stable Diffusion初体验

体验了下 Stable Diffusion 2.0 的图片生成&#xff0c;效果还是挺惊艳的&#xff0c;没有细调prompt输入&#xff0c;直接输入了下面的内容&#xff1a; generate a Elimination Game image of burnning tree, Cyberpunk style 然后点击生成&#xff0c;经过了10多秒的等待就输…

TensorRT模型优化模型部署(七)--Quantization量化(PTQ and QAT)(二)

系列文章目录 第一章 TensorRT优化部署&#xff08;一&#xff09;–TensorRT和ONNX基础 第二章 TensorRT优化部署&#xff08;二&#xff09;–剖析ONNX架构 第三章 TensorRT优化部署&#xff08;三&#xff09;–ONNX注册算子 第四章 TensorRT模型优化部署&#xff08;四&am…

Redis info命令生产监控和config配置命令

1.info命令 info命令介绍&#xff1a;服务器的各种信息和统计数值 # Server&#xff1a;有关Redis服务器的常规信息 redis_version:6.2.14 # Redis版本 redis_mode:standalone # 运行模式&#xff1a;单机或者集群 multiplexing_api:epoll # Redis所使用的事件处理机制 run_i…

国产麒麟系统开机没有网络需要点一下这个设置

问题描述&#xff1a; 一台国产电脑网线连接正常&#xff0c;打开网页后显示无法访问&#xff0c;那么是什么原因无法上网呢&#xff1f;下面就告诉你一个小方法去解决一下这个问题&#xff1b; 检查故障&#xff1a; 检测交换机、网线、水晶头全都正常&#xff0c;同房间摆放的…

Hive基础知识(十):Hive导入数据的五种方式

1. 向表中装载数据&#xff08;Load&#xff09; 1&#xff09;语法 hive> load data [local] inpath 数据的 path[overwrite] into table student [partition (partcol1val1,…)]; &#xff08;1&#xff09;load data:表示加载数据 &#xff08;2&#xff09;local:表示…

【从0上手cornerstone3D】如何渲染一个基础的Dicom文件(含演示)

一、Cornerstone3D 是什么&#xff1f; Cornerstone3D官网&#xff1a;https://www.cornerstonejs.org/ 在线查看显示效果&#xff08;加载需时间&#xff0c;可先点击运行&#xff09;&#xff0c;欢迎fork 二、代码示例 了解了Cornerstone是什么&#xff0c;有什么作用后&…

QT 检测是否有网络

一、模拟一个请求去判断是否有网&#xff0c;此处需要加个事件循环&#xff0c;实现阻塞等待网络请求的完成。 这是因为Qt的网络模块是基于事件驱动的&#xff0c;网络请求的完成是通过信号和槽机制来通知的。在没有事件循环的情况下&#xff0c;主线程会立即执行到return语句&…

竞赛保研 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

2024年湖北职称评审对论文的要求

1.期刊发表版面的时间节点2024年12月及之前 2.期刊是正规的期刊&#xff0c;有国内刊号 3.期刊能在国家出版社总署检索到 4.文章内容查重符合知网查重标准 5.论文方向和申报专业方向一致 6.必须要是第一作者或者独著 7.评正高的人才们要准备中文核心论文两篇或出版专业学术论著…

ReactHooks:useEffect使用指南

useEffect 基本使用 useEffect 根据传参个数和传参格式&#xff0c;它的执行次数和执行结果是不同的。 useEffect(setup, dependencies?) 在没有依赖项数组时&#xff0c;每次渲染之后都会执行 Effect依赖项数组可以设置多个依赖项&#xff0c;其中任意一项发生变化&#x…

UE5 简易MC教程学习心得

https://www.bilibili.com/video/BV12G411J7hV?p13&spm_id_frompageDriver&vd_sourceab35b4ab4f3968642ce6c3f773f85138 ———— 目录 0.摧毁逻辑学习 1.发光材质灯方块 2.封装。想让子类 不更改父类的变量。 3.材质命名习惯。 0.摧毁逻辑学习 达到摧毁的条件…

用模方软件进行模型的透明贴图,为什么翻出来透明部分是黑的?

答&#xff1a;透贴需要用PNG格式。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持一键自动提取房屋结构&#xff0c;平均1栋复杂建筑物只需3…

JAVA毕业设计121—基于Java+Springboot的房屋租赁管理系统(源代码+数据库+9000字文档)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot的房屋租赁管理系统(源代码数据库9000字文档)121 一、系统介绍 本项目还有ssm版本&#xff0c;分为用户、房东、管理员三种角色 1、用户&#xff1a; 注册、登…

【机器学习300问】5、什么是强化学习?

我将从三个方面为大家简明阐述什么是强化学习&#xff0c;首先从强化学习的定义大家的了解强化学习的特点&#xff0c;其次学习强化学习里特殊的术语加深对强化学习的理解&#xff0c;最后通过和监督学习与无监督学习的比较&#xff0c;通过对比学习来了解强化学习。 一、强化…

thinkphp6报错Driver [Think] not supported.

thinkphp6报错Driver [Think] not supported. 问题解决方法测试 问题 直接使用 View::fetch();渲染模板报错 解决方法 这个报错是由于有安装视图驱动造成的 运行如下命令安装即可 composer require topthink/think-view官方文档中是这么写的 视图功能由\think\View类配合视…