记录我的学习笔记。
https://www.bilibili.com/video/av53602631/?from=www.sylar.top http://www.sylar.top/blog/
mkdir build && cd build && cmake ../ && make
软件 | 软件要求 |
---|---|
linux内核版本: | 2.6.18及以上版本 |
系统 | CentOs7 |
gcc版本 | 9.1及以上 |
cmake版本 | 3.0及以上 |
yaml-cpp版本 | 0.6.0及以上 |
boost版本 | 1.5.3及以上 |
openssl |
关于开发环境的问题,都可以看这篇文章。
https://www.cnblogs.com/music-liang/p/17940148
bin -- 二进制 build -- 中间文件路径 cmake -- cmake函数文件夹 CMakeLists.txt -- cmake的定义文件 lib -- 库的输出路径 Makefile sylar -- 源代码路径 tests -- 测试代码
1)Log4J
Logger(定义日志类别)
|
|-------Formatter(日志格式)
|
Appender(日志输出地方)
Config --> yaml yamp-cpp: github 搜 mkdir build && cd build && cmake .. && make install
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib64/libyaml-cpp.a
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/yaml-cpp
-- Installing: /usr/local/include/yaml-cpp/anchor.h
-- Installing: /usr/local/include/yaml-cpp/binary.h
-- Installing: /usr/local/include/yaml-cpp/contrib
yaml 文件的加载和解析
YAML::Node node = YAML::LoadFile(filename);
node.IsMap()
for(auto it = node.begin(); it!= node.end(); ++it){
it->first, it->second
}
node.IsSequence()
for(size_t i=0; i< node.size(); ++i){
}
node.IsScalar();
配置系统的原则,约定优于配置:
#同步系统时间
sudo ntpdate -u asia.pool.ntp.org
template<T, FromStr, ToStr>
class ConfigVar;
template<F, T>
LexicalCast;
//容器偏特化 ,支持vector
// list, set, unordered_set, map, unordered_map,
// map/unordered_map 支持 key = std::string
// Config::Lookup(key) ,key相同,类型不同,不会有报错。需要处理
自定义类型,需要实现sylar::LexicalCast,偏特化 实现后,就可以支持Config解析自定义类型. 自定义类型可以和常规stl容器一起使用
配置的事件机制 当一个配置项发生修改的时候,可以反向通知对应的代码,回调
logs:
- name: root
level: (debug, info, warn, error,fatal)
formatter: "%d%T%P%T%t%m%n"
appender:
- type: (StdoutLogAppender, FileLogAppender)
level: (debug, info,...)
file: /logs/xxx.log
sylar::Logger g_logger = sylar::LoggerMgr::GetInstance()->getLogger(name);
SYLAR_LOG_INFO(g_logger) << "xxxx log";
static Logger::ptr g_log = SYLAR_LOG_NAME("system");
// m_root, m_system->m_root
当logger 的appender为空,使用root写logger
//定义LogDefine LogAppenderDefine 偏特化 LexicalCast,
// 实现日志配置解析
遗留问题:
- appender 定义的 formatter 读取yaml 的时候,没有被初始化
- 去掉额外的调试日志
- 文件名问题
Thread, Mutex Pthread
pthread pthread_create
6D71互斥量 mutex 信号量 semaphore
和log来整合
Spinlock, 替换Mutex,提高性能
写文件,周期性, reopen(解决删除旧文件之后,新写入的数据丢失问题(因为好不到文件名了))
Config, RMutex
遗留问题:
test_config里面,重新加载配置文件的时候,终端报错了
YAML::Node root = YAML::LoadFile("/home/henry/workspace/bin/conf/test.yml");
sylar::Config::LoadFromYaml(root);
因为这里的路径错误了。(我本地.yml文件路径有调整,这里LoadFile的时候,找不到文件,然后就抛出了异常。报错的地方是一个异常。当时没有在第一时间识别这是一个异常。
定义协程接口 ucontext_t macro
Thread->main_fiber <-------> sub_fiber
^
|
v
sbu_fiber
直接在centos下面,通过man手册,查看C语言下面函数的定义
man assert
man pthread_create
man makecontext
cpp里面不熟悉的若干关键字
volatile
explicit
constexpr