此項(xiàng)目是根據(jù)sylar框架實(shí)現(xiàn),是從零開(kāi)始重寫(xiě)sylar,也是對(duì)sylar豐富與完善
項(xiàng)目地址:https://gitee.com/lzhiqiang1999/server-framework文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-434564.html
簡(jiǎn)介
項(xiàng)目介紹:實(shí)現(xiàn)了一個(gè)基于協(xié)程的服務(wù)器框架,支持多線程、多協(xié)程協(xié)同調(diào)度;支持以異步處理的方式提高服務(wù)器性能;封裝了網(wǎng)絡(luò)相關(guān)的模塊,包括socket、http、servlet等,支持快速搭建HTTP服務(wù)器或WebSokcet服務(wù)器。
詳細(xì)內(nèi)容:日志模塊,使用宏實(shí)現(xiàn)流式輸出,支持同步日志與異步日志、自定義日志格式、日志級(jí)別、多日志分離等功能。線程模塊,封裝pthread相關(guān)方法,封裝常用的鎖包括(信號(hào)量,讀寫(xiě)鎖,自旋鎖等)。IO協(xié)程調(diào)度模塊,基于ucontext_t實(shí)現(xiàn)非對(duì)稱協(xié)程模型,以線程池的方式實(shí)現(xiàn)多線程,多協(xié)程協(xié)同調(diào)度,同時(shí)依賴epoll實(shí)現(xiàn)了事件監(jiān)聽(tīng)機(jī)制。定時(shí)器模塊,使用最小堆管理定時(shí)器,配合IO協(xié)程調(diào)度模塊可以完成基于協(xié)程的定時(shí)任務(wù)調(diào)度。hook模塊,將同步的系統(tǒng)調(diào)用封裝成異步操作(accept, recv, send等),配合IO協(xié)程調(diào)度能夠極大的提升服務(wù)器性能。Http模塊,封裝了sokcet常用方法,支持http協(xié)議解析,客戶端實(shí)現(xiàn)連接池發(fā)送請(qǐng)求,服務(wù)器端實(shí)現(xiàn)servlet模式處理客戶端請(qǐng)求,支持單Reator多線程,多Reator多線程模式的服務(wù)器。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434564.html
環(huán)境變量模塊
- 提供程序運(yùn)行時(shí)的環(huán)境變量管理功能。這里的環(huán)境變量不僅包括系統(tǒng)環(huán)境變量,還包括程序自定義環(huán)境變量,命令行參數(shù),幫助選項(xiàng)與描述,以及程序運(yùn)行路徑相關(guān)的信息。
1. 主要功能
- 解析命令行參數(shù),并提供參數(shù)的幫助描述
- 獲取系統(tǒng)環(huán)境變量
- 獲取當(dāng)前程序運(yùn)行的絕對(duì)路徑,工作路徑及配置文件的路徑
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
- 處理當(dāng)前命令行參數(shù),系統(tǒng)環(huán)境變量,路徑等問(wèn)題。是一個(gè)單例模式
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; // 啟動(dòng)程序的名稱
std::string m_exe; // 程序執(zhí)行的絕對(duì)路徑
std::string m_cwd; // 絕對(duì)路徑的上一級(jí)路徑
};
typedef johnsonli::Singleton<Env> EnvMgr;
- 解析命令行參數(shù)。雙指針的思路。調(diào)用
readlink()
系統(tǒng)調(diào)用,可以獲取/proc/$pid/exe
軟鏈接文件指向的路徑,該路徑就是當(dāng)前文件執(zhí)行的絕對(duì)路徑。
std::map<std::string, std::string> m_args; // 存環(huán)境變量參數(shù)
// 初始化,解析
bool init(int argc, char** argv);
// 添加到m_args
void add(const std::string& key, const std::string& val);
// 判斷m_args有無(wú)該參數(shù)
bool has(const std::string& key);
// 刪除
void del(const std::string& key);
// 獲取
std::string get(const std::string& key, const std::string& default_value = "");
- 獲取/設(shè)置系統(tǒng)環(huán)境變量。主要使用
getenv()
和setenv()
兩個(gè)系統(tǒng)調(diào)用
// 設(shè)置系統(tǒng)環(huán)境變量
bool Env::setEnv(const std::string& key, const std::string& val)
{
return !setenv(key.c_str(), val.c_str(), 1);
}
// 獲取系統(tǒng)環(huán)境變量
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;
}
- 設(shè)置命令行參數(shù)幫助信息
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
方法,傳入一個(gè)相對(duì)于執(zhí)行文件的路徑,返回這個(gè)路徑的絕對(duì)路徑。比如默認(rèn)的配置文件路徑就是通過(guò)getAbsolutePath(get(“c”, “conf”))來(lái)獲取的,也就是配置文件夾默認(rèn)在執(zhí)行文件所在目錄的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"));
}
到了這里,關(guān)于從零開(kāi)始實(shí)現(xiàn)一個(gè)C++高性能服務(wù)器框架----環(huán)境變量模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!