摘要:
观察者模式 观察者模式解决什么问题? 经常看到一些对象调用其他对象的方法:因为实现复杂的任务通常需要几个对象一起合作完成,为了该目标,对象A为了调用对象B的方法,就必须知道对象B的存在及其接口。 最简单的办法是让A.cpp包含(include)B.h,然后直接调用B class方法。但这样做,做A中 阅读全文
摘要:
API包装器模式 通常,需要编写基于另一组类的包装器接口,用一个新的、更简洁的API,来隐藏所有底层遗留代码;或者,已经编写了C++ API,但后来需要给特定客户提供纯C接口,但又不想改变原来的代码封装;或者,你的API用的了一个第三方依赖库,你想让客户直接使用此库,但不想将此库直接暴露给客户。 包 阅读全文
摘要:
设备树简介 一个设备信息用树形结构表示如下: from http://www.100ask.org/ 如何用设备树进行描述呢? /{ // 表示root节点 cpu{ // cpu节点 name = val; // 属性名name,val是属性值。val形式:1)"string"(双引号括起来);2 阅读全文
摘要:
这部分主要讲Linux字符设备驱动程序的结构,解释主要组成部分的编程方法。 字符设备 **字符设备:**指只能一个byte一个byte读写的设备,不能随机读写数据,要按先后顺序。字符设备是面向流的设备,常见字符设备有鼠标、键盘、串口、终端、LED灯。 **块设备:**指可以从设备的任意位置读取一定长 阅读全文
摘要:
Linux内核模块简介 模块的基本概念 Linux内核非常庞大,包含很多组件。我们如何把需要的部分包含在内核中? 两种办法: 1)把所有需要的功能都编译进内核中。 会导致2个问题:生成的内核会非常大;为现有内核添加、删除功能,将不得不重新编译。 2)不包含所有功能,需要的时候,动态地加载代码到内核。 阅读全文
摘要:
Pimpl惯用法 Pimpl术语,即“pointer to implementation”(指向实现的指针),由Jeff Summer最先引入。该技巧可以避免在头文件中暴露私有细节,是促进API接口和实现保持完全分离的重要机制。 Pimpl并不是严格意义上的设计模式,而是桥接模式的一种特例。 如下图 阅读全文
摘要:
单例模式的惯用实现 一直以来,我在C++中是这样实现单例模式的 class Singleton { public: static Singleton& GetInstance() { static Singleton instance; return instance; } private: Sin 阅读全文
摘要:
shared_ptr 不能访问一个空智能指针所接管对象的数据成员或函数成员 当不能确定一个智能指针释放已经释放接管的内存时,需要对其进行空指针判断。因为决不能访问一个空智能指针对象的成员(数据成员或函数成员),否则可能会造成程序崩溃。 如果程序异常退出码为139,则有可能是因为访问空智能指针成员。 阅读全文
摘要:
找一个进程可用端口号 如果我们想尝试哪个端口号可用,然后监听该端口,该如何处理?比如FTP协议里面有这样一个需求,PASV模式下,Server需要监听本地数据端口,通常是找一个随机端口号进行监听。而且每收到一个客户PASV命令后,就需要提供一个不同的数据端口,这也就是说,不能两个连接同时使用同一个数 阅读全文
摘要:
背景 进程主要分为两部分: 1)进程管理,见Linux进程管理。 2)进程调度,见Linux进程调度。 进程调度程序,也称调度程序,是内核的组成部分,负责选择下一个要运行的进程。 意义 只有合理的调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行效果。 [ ] 调度策略 调度程序原则 最大限 阅读全文
摘要:
背景 进程主要分为两部分: 1)进程管理,见Linux进程管理。 2)进程调度,见Linux进程调度。 这部分主要讲进程管理。 进程和文件是Unix OS的2个最基本抽象。一个进程就是处于执行期的程序。 进程包括:一段可执行程序代码(代码的text section),打开的文件、挂起的信号、内核内部 阅读全文
摘要:
背景 Linux中断上半部,参见Linux中断和中断处理程序 。 Linux中断下半部,参见Linux中断下半部及推后执行的工作。 这部分讲中断下半部和推后执行的工作。 中断处理程序(中断上半部)的局限: 以异步方式执行,并且有可能打断其他重要代码(包括其他中断处理程序)的执行。因此,中断处理程序应 阅读全文
摘要:
最近在做与Unix/Linux的简化路径(simplify path)或称清理路径(clean path)有关的工作,刚刚好碰到这类问题,记录一下。 题目 地址:LeetCode 71. 简化路径 题目描述 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 阅读全文
摘要:
I/O复用简介 传统的编程模型中,要确定某个文件描述符是否发生关心的事件,需要对其进行轮询。一旦要监听的文件描述符数量众多,可能会导致效率很低。 I/O 复用技术能有效减少需要轮询的文件描述符数量,将其缩减至1个,即I/O复用的系统调用本身,同时,程序也能监听多个文件描述符。这对提高程序性能很重要。 阅读全文
摘要:
本文汇总一些C/C++工程实践中碰到的编译、调试问题,以便以后碰到类似问题时,能快速定位、解决。 会长期更新。 C/C++编程 1. extra qualification on member 编译时报错,详细报错信息 extra qualification ‘ftp::UserInfo::’ on 阅读全文
摘要:
C++11提供chrono库,可以很方便地用于处理日期和时间。 chrono库主要包含3种类型:时间间隔duration、时钟clocks、时间点time point。 duration:记录时间长度 duration 表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟,或几个小时的时间间隔。 阅读全文
摘要:
generate_export_header简介 generate_export_header()用于为library export宏定义。生成一个适用于预处理的文件,包含用在library中的EXPORT宏定义。 适用场景:假设我们用了一个自定义library,为避免跟用到的其他库重名,但又不得不 阅读全文
摘要:
include_directories 将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。 语法格式: include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) 默认情况下,include_dire 阅读全文
摘要:
CMake调用环境变量 查看环境变量 使用$ENV{NAME}指令,例如, message(STATUS "HOME dir: $ENV{HOME}") 设置环境变量 使用set函数 + ENV指令 set(ENV{变量名} 值) 注意: 1)读环境变量时,需要加上$;写环境变量时,不需要加$。 2 阅读全文
摘要:
configure_file简介 configure_file 将文件复制到另一个位置并修改其内容。该命令将<input>文件复制到<output>文件,并根据指定规则对其内容进行转换。 configure_file(<input> <output> [NO_SOURCE_PERMISSIONS | 阅读全文