当前位置: 首页 > news >正文

从零开始实现一个C++高性能服务器框架----环境变量模块

此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善
项目地址:https://gitee.com/lzhiqiang1999/server-framework

简介

项目介绍:实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括socket、http、servlet等,支持快速搭建HTTP服务器或WebSokcet服务器。
详细内容:日志模块,使用宏实现流式输出,支持同步日志与异步日志、自定义日志格式、日志级别、多日志分离等功能。线程模块,封装pthread相关方法,封装常用的锁包括(信号量,读写锁,自旋锁等)。IO协程调度模块,基于ucontext_t实现非对称协程模型,以线程池的方式实现多线程,多协程协同调度,同时依赖epoll实现了事件监听机制。定时器模块,使用最小堆管理定时器,配合IO协程调度模块可以完成基于协程的定时任务调度。hook模块,将同步的系统调用封装成异步操作(accept, recv, send等),配合IO协程调度能够极大的提升服务器性能。Http模块,封装了sokcet常用方法,支持http协议解析,客户端实现连接池发送请求,服务器端实现servlet模式处理客户端请求,支持单Reator多线程,多Reator多线程模式的服务器。

环境变量模块

  • 提供程序运行时的环境变量管理功能。这里的环境变量不仅包括系统环境变量,还包括程序自定义环境变量,命令行参数,帮助选项与描述,以及程序运行路径相关的信息。

1. 主要功能

  • 解析命令行参数,并提供参数的帮助描述
  • 获取系统环境变量
  • 获取当前程序运行的绝对路径,工作路径及配置文件的路径

2. 功能演示

int main(int argc, char** argv)
{johnsonli::EnvMgr::GetInstance()->addHelp("d", "run in daemon");johnsonli::EnvMgr::GetInstance()->addHelp("p", "print help");johnsonli::EnvMgr::GetInstance()->addHelp("s", "start in terminal");if(!johnsonli::EnvMgr::GetInstance()->init(argc, argv)){johnsonli::EnvMgr::GetInstance()->printHelp();return 0;}LOG_INFO(g_logger) << "exe: " << johnsonli::EnvMgr::GetInstance()->getExe();LOG_INFO(g_logger) << "cwd: " << johnsonli::EnvMgr::GetInstance()->getCwd();LOG_INFO(g_logger) << "path: " << johnsonli::EnvMgr::GetInstance()->getEnv("PATH", "XXX");if(johnsonli::EnvMgr::GetInstance()->has("p")){johnsonli::EnvMgr::GetInstance()->printHelp();}return 0;}

3. 模块介绍

3.1 Env

  • 处理当前命令行参数,系统环境变量,路径等问题。是一个单例模式
class Env
{
public:typedef RWMutex RWMutexType;bool init(int argc, char** argv);void add(const std::string& key, const std::string& val);bool has(const std::string& key);void del(const std::string& key);std::string get(const std::string& key, const std::string& default_value = "");void addHelp(const std::string& key, const std::string& desc);void removeHelp(const std::string& key);void printHelp();const std::string& getExe() const { return m_exe;}const std::string& getCwd() const { return m_cwd;}bool setEnv(const std::string& key, const std::string& val);std::string getEnv(const std::string& key, const std::string& default_value = "");std::string getAbsolutePath(const std::string& path) const;std::string getAbsoluteWorkPath(const std::string& path) const;std::string getConfigPath();private:RWMutexType m_mutex;std::map<std::string, std::string> m_args;std::vector<std::pair<std::string, std::string> > m_helps;std::string m_program;  // 启动程序的名称std::string m_exe;      // 程序执行的绝对路径std::string m_cwd;      // 绝对路径的上一级路径
};typedef johnsonli::Singleton<Env> EnvMgr;
  • 解析命令行参数。双指针的思路。调用readlink()系统调用,可以获取/proc/$pid/exe软链接文件指向的路径,该路径就是当前文件执行的绝对路径。
std::map<std::string, std::string> m_args; // 存环境变量参数
// 初始化,解析
bool init(int argc, char** argv);
// 添加到m_args
void add(const std::string& key, const std::string& val);
// 判断m_args有无该参数
bool has(const std::string& key);
// 删除
void del(const std::string& key);
// 获取
std::string get(const std::string& key, const std::string& default_value = "");
  • 获取/设置系统环境变量。主要使用getenv()setenv()两个系统调用
// 设置系统环境变量
bool Env::setEnv(const std::string& key, const std::string& val) 
{return !setenv(key.c_str(), val.c_str(), 1);
}// 获取系统环境变量
std::string Env::getEnv(const std::string& key, const std::string& default_value) 
{const char* v = getenv(key.c_str());if(v == nullptr) {return default_value;}return v;
}
  • 设置命令行参数帮助信息
std::vector<std::pair<std::string, std::string> > m_helps;	// 存帮助信息
void addHelp(const std::string& key, const std::string& desc);
void removeHelp(const std::string& key);
void printHelp();
  • getAbsolutePath方法,传入一个相对于执行文件的路径,返回这个路径的绝对路径。比如默认的配置文件路径就是通过getAbsolutePath(get(“c”, “conf”))来获取的,也就是配置文件夹默认在执行文件所在目录的conf文件夹。
std::string Env::getAbsolutePath(const std::string& path) const 
{if(path.empty()){return "/";}if(path[0] == '/'){return path;}return m_cwd + path;
}std::string Env::getAbsoluteWorkPath(const std::string& path) const {if(path.empty()) {return "/";}if(path[0] == '/') {return path;}static johnsonli::ConfigVar<std::string>::ptr g_server_work_path =johnsonli::Config::Lookup<std::string>("server.work_path");return g_server_work_path->getValue() + "/" + path;
}std::string Env::getConfigPath() 
{return getAbsolutePath(get("c", "conf"));
}

相关文章:

从零开始实现一个C++高性能服务器框架----环境变量模块

此项目是根据sylar框架实现&#xff0c;是从零开始重写sylar&#xff0c;也是对sylar丰富与完善 项目地址&#xff1a;https://gitee.com/lzhiqiang1999/server-framework 简介 项目介绍&#xff1a;实现了一个基于协程的服务器框架&#xff0c;支持多线程、多协程协同调度&am…...

git常用命令的解释

解释git add . git add . 命令用于将当前目录下的所有文件添加到 Git 仓库的暂存区中。这个命令通常用于刚刚打开一个 Git 仓库时&#xff0c;或者用于将本地文件更新到远程仓库时。 具体来说&#xff0c;git add . 命令会将当前目录下的所有文件添加到 Git 仓库的暂存区中&am…...

DNS和CDN的区别与联系

现在互联网用户很多不能理解CDN和DNS之间的关系&#xff0c;他们之间到底有什么区别。对于这两者永远处于模糊的概念。其实二者是相辅相成的&#xff0c;二者搭配起来能使网站更加安全&#xff0c;快速。 用户访问未使用CDN缓存网站的过程为: 1、用户向浏览器提供要访问的域名…...

Java基础知识 | 常见面试题(中):面向对象基础

撰写成一问一答的形式&#xff0c;每次回答都默写&#xff0c;对比参考答案后&#xff0c;再默写出更恰当的答案。 相关内容 Java基础知识 | 常见面试题&#xff08;上&#xff09;&#xff1a;基础概念和常识 Java基础知识 | 常见面试题&#xff08;上&#xff09;&#xff1a…...

勒索软件正在从 Windows 转向 Linux

听说勒索软件正在从 Windows 转向 Linux了勒索软件正在从 Windows 转向 Linux 最近几周&#xff0c;黑客们一直在对 Linux 企业网络部署 IceFire 勒索软件&#xff0c;这是一个值得注意的转变&#xff0c;因为它曾经是一个只针对 Windows 的恶意软件。与 Windows 相比&#xf…...

信息系统项目管理师 第11章 项目成本管理

1.管理基础 1.重要性和意义 项目管理主要受范围、时间、成本、质量的约束,项目成本管理就是要确保在批准的预算内完成项目。 如果项目建设的实际成本远远超出批准的投资预算,就很容易造成成本失控。 1.对工程项目认识不足。 2.组织制度不健全。 3.方法问题 4.技术的制约 5.需…...

XML 简介

文章目录一、XML 简介二、XML 用途总结一、XML 简介 XML 被设计用来传输和存储数据。 HTML 被设计用来显示数据。 XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 可扩展标记语言&#xff08;英语&#xff1a;Extensible Markup Language&#xf…...

ERP:华为杀入,金蝶们打颤?

配图来自Canva可画 近期&#xff0c;华为官方透露将在4月份推出自研MetaERP管理系统&#xff0c;引来不少媒体和业内人士的围观&#xff0c;紧接着关于华为“进军ERP市场”的解读更是不胫而走&#xff0c;所谓一石激起千层浪&#xff0c;此说法一出&#xff0c;直接导致了金蝶…...

Linux——总复习1

1.要注意自己处于当前那个目录位置。 2.将file1的前五行/后三行重定向、附加到file2【输出重定向】 head -5 file1 > file2 tail -3 file1 >> file2 3.ls与cat区别 ls:列出目录的目录内容&#xff0c;未指定目录&#xff0c;则列出当前工作目录的内容 -l:查…...

控制SQL*PLUS的环境和数据字典简介

可以通过使用SET命令来设置SQL*PLUS的环境变量&#xff0c;从而达到控制SQL*PLUS 环境的目的。 SET命令的格式如下&#xff1a; SET 环境变量 变量的值 可以通过使用SHOW命令来显示SQL*PLUS环境变量的配置。SHOW 命令的格式如下&#xff1a; SHOW 环境变量|ALL 下面用一个…...

Chapter11.3:MATLAB_SIMULINK在离散系统中的应用

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…...

过滤器Filter

什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是JavaWeb三大组件&#xff08;Servlet、FIlter、Listener&#xff09;之一。过滤器可以把对资源的请求拦截下来&#xff0c;总而实现一些特殊的功能 使用过滤器后&#xff0c;要想访问web服务器上的资源&#xff0c;必须…...

MySQL数据同步ES的常用思路和方法

文章目录 1.同步双写2.异步双写3.定时任务4.数据订阅大家应该都在各种电商网站检索过商品,检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。 那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢? 1.同步双…...

spring源码之扫描前设置

扫描前设置 &#x1f6f9;源码源码说明总结启动一个springboot项目源码 org.springframework.context.annotation.ComponentScanAnnotationParser#parse public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, String declaringClass) {// 创建C…...

C++ 98/03 应该学习哪些知识19

迭代器、空间配置器理解 在 C 中&#xff0c;迭代器是一种可以用来遍历容器中的元素的对象。它们提供了一个类似于指针的接口&#xff0c;允许我们访问容器中的元素&#xff0c;而不必了解容器内部的结构。迭代器是 STL&#xff08;标准模板库&#xff09;的核心部分&#xff0…...

java毕业生就业信息管理系统servlet程序

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…...

linux命令-netstat

linux命令-netstat 查看Linux中网络系统状态信息 补充说明 netstat命令 用来打印Linux中网络系统的状态信息&#xff0c;可让你得知整个Linux系统的网络情况。 语法 netstat(选项)选项 -a或--all&#xff1a;显示所有连线中的Socket&#xff1b; -A<网络类型>或--&…...

微服务+springcloud+springcloud alibaba学习笔记【Rest微服务工程搭建】(2/9)

Rest微服务工程搭建---学习笔记2/91、简单架构示意图2、创建Cloud-provider-payment8001 微服务提供者Module模块2.1. 建Module2.2. 改pom2.3. 写yml2.4. 主启动2.5. 业务类3、创建Cloud-consumer-order80 微服务消费者订单Module模块3.1. 建Module3.2. 改pom3.3. 写yml3.4. 主…...

【Redis7】Redis7 十大数据类型

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 十大数据类型。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【Redis7】Redis7概述、安装…...

java 死锁怎么解决, 盘它

死锁归根结底还是资源的安排有问题如何使用 jps jstack,解决死锁如果是在分布式的系统中, 我该如何一步一步找到对应的堆栈解决死锁问题呢如何利用 skywalking 帮我解决死锁大多数人一辈子只做了三件事&#xff0c;自欺欺人被人欺 如何使用 jps jstack,解决死锁 jps和jstack都…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...