sylar-from-scratch----环境变量模块

15 阅读6分钟

环境变量模块概述

只包含一个类Env,包含的环境变量信息有:系统环境变量m_args、程序自定义环境变量m_args、命令行参数、帮助选项与描述m_helps和程序运行路径的相关信息(完整路径m_exe与当前路径m_cwd)。
主要接口有添加、删除、查询、获取自定义环境变量;增加、删除、获取命令行帮助信息和获取完整路径、当前路径;给定一个相对路径返回绝对路径;设置、获取系统变量。 该类被包装为单例模式typedef sylar::Singleton<Env> EnvMgr,确保一个类只有一个实例,并提供全局访问,便于统一管理。

1、环境变量模块初始化init

  • 参数:函数参数为main函数中的函数参数argv与argc,argv[0]参数为命令行程序名称m_program,argv为命令行选项与值,其以-开头,后面跟可选参数,选项与参数结构为std::vector<std::pair<<std::string,std::string>>,若key没有value,则value为空字符串。
  • 功能:记录程序名称与当前路径,解析命令行选项与参数将其添加在自定义环境变量中,以空格分隔。
for (int i = 1; i < argc; ++i) {
        if (argv[i][0] == '-') {//key开始处
            if (strlen(argv[i]) > 1) {//value有效
                if (now_key) {//除‘-’后的value调用add函数添加在自定义环境变量中,以空格与下一个隔开
                    add(now_key, "");
                }
                now_key = argv[i] + 1;
            } else {//value长度小于0,打印相关日志信息
                SYLAR_LOG_ERROR(g_logger) << "invalid arg idx=" << i
                                          << " val=" << argv[i];
                return false;
            }
        } else {//当前参数不是以 - 开头,则将其视为上一个参数的值,并将键值对添加到环境变量中
            if (now_key) {
                add(now_key, argv[i]);
                now_key = nullptr;
            } else {
                SYLAR_LOG_ERROR(g_logger) << "invalid arg idx=" << i
                                          << " val=" << argv[i];
                return false;
            }
        }
    }
    if (now_key) {//如果在遍历完成后还存在未添加的键值对,则将其添加到环境变量中
        add(now_key, "");    }
    return true;

2、添加、查询、获取、删除自定义环境变量add\has\get\del

  • add参数:键值key、value;
  • add功能:获取了写锁以确保线程安全,将键值对添加到环境变量m_args中。
  • has参数:键key;
  • has功能:获取读锁 lock,以确保在多线程环境下对 m_args 的安全访问,查询自定义环境变量m_args中是否有key值,返回布尔类型。
  • get参数:键值key、默认value;
  • get功能:获取读锁 lock,以确保在多线程环境下对 m_args 的安全访问,查询自定义环境变量m_args中是否有key值,有则返回其value值,没有返回默认value。
  • del参数:键key;
  • del功能:获取了写锁以确保线程安全,删除自定义环境变量m_args中key对应的键值对。

3、增加、删除、获取命令行帮助信息addHelp\removeHelp\printHelp

  • removeHelp参数:键key;
  • removeHelp功能:获取写锁以确保线程安全,遍历命令行帮助变量m_helps中键值对,找到对应key进行删除;
  • addHelp参数:选项名key,选项描述desc;
  • addHelp功能:删除键值为key的帮助信息,获取写锁以确保线程安全;
  • m_helps.push_back(std::make_pair(key, desc))实现帮助选项的添加。
  • printHelp参数:无;
  • printHelp功能:获取读锁 lock,以确保在多线程环境下对 m_helps 的安全访问,遍历命令行帮助变量m_helps中键值对按照一定格式输出。

4、设置、获取系统变量setEnv\getEnv

  • setEnv参数:键值key,value;
  • setEnv功能: setenv 函数将键为 key 的环境变量的值设置为 val,并将返回值取反。如果设置成功,setenv 函数返回 0,取反后为 true;如果设置失败,setenv 函数返回 -1,取反后为 false。
  • getEnv参数:键值key、默认value;
  • getEnv功能:获取环境变量中指定键 key 的值,如果键不存在,则返回默认值 default_value。

5、获取完整路径、当前路径、给定一个相对路径返回绝对路径getAbsoluteWorkPath\getConfigPath\getAbsolutePath

  • getAbsolutePath参数:相对当前的路径path;
  • getAbsolutePath功能:提供一个相对当前的路径path,返回这个path的绝对路径 (当前路径m_cwd+绝对路径path)。
  • getAbsoluteWorkPath参数:
  • getAbsoluteWorkPath功能:获取工作路径下path的绝对路径
std::string Env::getAbsoluteWorkPath(const std::string& path) const {
    if(path.empty()) {
        return "/";
    }
    if(path[0] == '/') {
        return path;
    }
    static sylar::ConfigVar<std::string>::ptr g_server_work_path =
        sylar::Config::Lookup<std::string>("server.work_path");
    return g_server_work_path->getValue() + "/" + path;
}
  • getConfigPath参数:无
  • getConfigPath功能:获取配置文件夹路径,配置文件夹路径由命令行-c选项传入。getAbsolutePath(get("c", "conf"))获取"c"对应的value值,调用 getAbsolutePath获取当前路径。

基础知识

1、单例模式

核心思想是确保一个类只有一个实例,并提供全局访问点来获取这个实例。

优点

  • 节省资源:一个类只有一个实例,不存在多份实例,节省资源;
  • 方便控制:避免多个实例化对象引起的复杂操作。
    比如,Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

使用场景

  • 共享资源:多个组件或模块共享资源,如共享数据库连接、共享配置文件等;
  • 控制资源数量:需要严格限制资源数量时,如线程池、缓存、日志记录器等;
  • 独立配置:需要全局配置时,如应用程序的全局配置;
  • 系统状态:表示整个系统的状态,如用户绘画管理。

代码实现

限制类的构造函数;
静态方法提供一个全局变量进行唯一访问。 blog.csdn.net/Attitude93/…

2、环境变量获取与设置getenv、setenv

头文件#include<stdlib.h>

  • setevn函数:用于设置环境变量,若环境变量不存在则创建它,若存在则根据overwrite的值进行覆盖或保留原有值,执行成功返回0,有错误发生返回-1。原型为
    int setenv(const char *name, const char *value, int overwrite);
  • name参数为环境变量的名称,value为分配给环境变量的值,overwrite为非零值时表示覆盖同名环境变量,为零则不覆盖。 getenv函数:获取指定环境变量名的值,返回该值的指针,找不到则返回空指针,其原型为
    char *getenv(const char *name);