C 语言
在 1989 年,美国国家标准协会 (ANSI) 对 C 语言进行了标准化,此时 C 语言又被称为 ANSI C。在一年后被国际标准化组织 ISO 采纳,所以 C 语言在 ISO 中有了一个官方名称 ISO/IEC 9899:1990 ,其中 9899 是 C 语言在 ISO 标准中代号 (C++ 是 14882),冒号后面的 1990 表示当前修订好的版本是在 1990 年发布。
所以,最开始的 C 语言标准也被称为 C89、C90 或者 C89/C90,后续又在 1999、2007、2011 进行了改进。另外,C++ 在从 C++11 之后,基本固定每三年发布一个新版本。
- 整数介绍 包括了类型提升、整型溢出等。
- 宏使用 一些基本使用规则,以及常见注意事项。
- 数据对齐 结构体以及内存的对齐方式。
- 指针简介 包括了基本概念、函数指针等概念的介绍。
- 位域和字节序 位域或位段相关概念,以及大小端字节序相关的内容。
- inline 简介 有点类似于 C 中的宏,但是又有所区别。
- Volatile 简介 C 语言中与 volatile 相关的介绍。
基本概念
不只是 C 相关代码,实际上更多的是 Linux 中的基本介绍。
- 程序简介 与执行程序相关的一些基本概念,例如 ELF 格式、内存分布等。
- ELF 详解 介绍 ELF 文件格式的详细内容,还可以参考 符号表 以及 最小的 ELF 文件 。
程序加载
详细介绍从 Bash 启动运行,到最终调用到函数执行。
- 加载过程 包括从 Bash 到内核加载,再到用户态的 ld 加载解析,也可以通过 API 加载包含使用注意事项。
- Preload 简介 允许应用在加载其它动态库之前先加载,可以用来替换某些函数。
- PLT GOT 介绍 介绍动态库在运行过程中如何寻找到函数的地址,这里会讨论实现的机制、风险等。
网络编程
- 基础技巧 简单介绍在 Linux C 中进行网络编程时常用到的一些技巧。
- 端口使用 一般客户端无需指定端口,如果需要也可以指定,注意不要冲突。
- UDP 通讯优化 UDP 并非一个面向连接的协议,与 TCP 不同,有其相关的优化方法。
- 多路复用 通过 IO 多路复用提高系统性能,包括了 select、poll、epoll 。
- Socket 关闭方式 主要介绍了通过 close() 以及 shutdown() 方式关闭 Socket 。
- socketfs 内核中用户程序与网络协议栈之间的接口层。
GCC 相关
Test
测试主要是为了可以提前发现异常,尤其是当重构时,可以进行完整的验证,所以,就慢慢衍生出了所谓 Test Drived Develop, TDD,而且产生了很多测试方法。
- 代码覆盖率 使用 GCC 自带的工具可以很简单的统计代码覆盖率。
- 竞态检查 一些常见的 Sanitizer 介绍,包括其原理。
- 单元测试 编译过程中提供了强弱符号的概念,可以用于类似单元测试的场景。
- Fuzzing 测试 也就是模糊测试,介绍一些基本原理以及使用方法。
- Fail Points BSD 中的一种构造异常的测试机制。
其它
- 特性宏 除了提供基础的 C 语言实现库,另外比较关键的是通过宏在编译阶段适配不同环境。
- 浮点数 计算机中所有的数据都是以二进制方式保存,包括浮点数,会导致精度有问题。
- 常用函数 包括了qsort、bsearch、backtrace、atexit 等函数。
- 内联汇编 GNU 中如何所用内联汇编。
- 信号安全 一般会在信号处理里打印日志,不过也可能会因此导致发生死锁。
- 安全编译 GCC 提供的一系列安全编译的选项,简单介绍。
- 错误信息 C 中在打印错误信息的时候应该注意那些。
- Umask 使用 通过 umask 可以在不修改代码直接调整文件的默认打开权限。
- 替换 malloc 简单介绍如何替换掉 glibc 中的一系列内存相关函数。
- 字符串操作 与字符串相关的函数,例如格式化、查找、转换等等,还可以参考 正则表达式 。
- 易错知识点 整理记录了容易混淆、犯错的地方,有些会有点偏。
- 奇技淫巧 整理下 C 语言中常用的技巧。
- 通配符 也就是 Linux 中与通配符相关的内容。
- 数据压缩 常见的如 zlib、snappy 等压缩算法,这里仅介绍代码使用。
- C11 标准解读 常见的一些新标准支持的特性。
- AIO 简单介绍下 Linux 平台下的异步读写模型。
- 版本发布 整理下 C 语言中调试、发布的流程,以及相关注意事项。
CPP
可以认为是在 C 的基础上添加了面向对象的功能,其编译、链接、调试等基本都可以通过一个工具链完成。
- 基本概念 介绍基本的语法,例如封装、继承、多态、多线程等等。
- 构造析构 在对象内存申请完之后会通过构造函数初始化,不同场景包含了多种构造函数。
- 强制转换 按照不同的场景提供了不同的类型转换方法,这样在异常是可以及时发现。
- 右值引用 这是 C++11 中引入的特性,可以避免非必要拷贝、模板按类型转发。
- 智能指针 C/C++ 需要自己管理内存,如果管理不当很容易造成泄漏,通过智能指针可在一定程度上降低。
- 调用对象 通过可调用对象覆盖了函数指针、函数、lambda 等。
- 常见问题 整理一些常见的错误示例。
其它
- STL 使用 提供了通用的模板类和函数,这里整理常用的示例。
常用工具
- BenchMark Google 提供的性能压测工具,还包括单元测试 GTest、Mock 测试套 GMock、命令行解析 GFlags 等。
- CRC 循环冗余校验,通常用于网络、文件等校验。
- Breakpad 跨平台的 Crash 状态收集工具。
- CMocka 在 C 语言中使用的 Mock 库。
参考
- Awesome CPP 一些经典常见的工具、库等。
- CPP Reference 整理了很多 C/C++ 的规范,可以查询一些常见的基本概念。
- Compiler Explorer 可根据不同编译器版本进行编译,并查看其汇编代码,以此判断编译器对代码影响,例如并发编程。
编译链接
- 编译链接、链接顺序 静态库的不同顺序会影响最终二进制的生成,这里简单介绍。
- 二进制接口 用来约束二进制调用接口,是编译器和连接器需要遵守的规则。
- 强弱符号 编译过程中提供了强弱符号的概念,可以用于简单的覆盖。
- 工具解析 介绍一些在 Linux 常用的二进制解析工具,例如readelf、nm、ldd等。
自动编译
其中 CMake 在后续详细介绍,这里仅介绍一些其它常用的。
- Makefile 也就是最基本的 Makefile ,其它工具一般最后都是生成该文件。
- AutoTools 比较老也是比较经典的自动编译工具。
- Package 管理 Linux 提供的一种工具,通常在动态库编译时的参数配置。
CMake
这是一个跨平台的自动编译、打包工具,可以通过简单语句描述编译过程,可以输出对应的 Makefile 文件。
Linux 编程
在 Linux 环境下会有不同的实现。
- 网络编程 网络编程中的基本概念,例如结构体、域名解析、IP 地址等。
- 进程创建 Linux 中有多种子进程的创建方式,这里详细介绍其用法。
- 动态参数 在函数传参过程中允许使用多个动态参数,这里介绍如何使用以及其原理。
- Direct IO 可以直接在应用层和磁盘之间建立通道,减少上下文切换次数。
libev
libev 是一个基础的高性能事件库,提供了跨平台能力,而且代码很少,使用非常灵活。除了基础的 IO、定时器、信号的处理之外,同时还提供了一些循环中经常使用的 hook 处理。
还可以参考 libevent 使用。
- 基本介绍 一个简单而且高性能的事件库,支持常规的 IO、定时器等事件,同时支持多线程模式。
- 源码实现 大致介绍核心逻辑的源码实现方案,同时包含一些常用的事件模块实现。
- 时间处理 简单介绍下 libev 库中与时间相关的内容。
- 信号处理 信号的处理非常敏感,如果处理不当很容易出现问题。
内存检查
GDB
GDB 是一个很强大的调试工具,支持远程调试、嵌入式调试、输出的重定向。
- 基本介绍 简单介绍其常用的功能,包括 watchpoint、catchpoint 等内容。
- 调试格式 这里对标准的 DWARF 格式进行详细介绍。
- 栈帧分析 栈是一块内存空间,会从高地址向低地址增长,用于保存临时变量、传参等。
- 初始脚本 启动时会默认加载初始化脚本,通常是部分命令配置以及一些复杂函数。
- Python脚本 在 7.X 之后的版本中增加了 Python 脚本支持,比之前的 DSL 实现要强大很多。
- 死锁分析 简单介绍如何通过 gdb 处理代码中的死锁。
- 常用命令 整理常用的命令,也就是 Cheatsheet 命令集。
常用实现
- flock 通常用于单进程应用的检查,可以有效确保只有单个进程使用。
- core 在 Linux 中可以用来生成 CoreDump 文件,用来异常问题定位。
- gettext 用来在 C 语言中通过 gettext 实现多语言编程。
- uuid 用在分布式系统中生成唯一的 ID 标识。
- getopt 用于命令行的参数解析,包括了短参和长参。
- zeromq 非常简单好用的传输层实现,使得 Socket 编程更加简单高效,包括 架构设计 。
编程技巧
词法语法解析
Lex (A Lexical Analyzer Generator) 和 Yacc(Yet Another Compiler Compiler) 是 UNIX 中两个非常重要的、功能强大的工具,分别用来做词法扫描以及语法分析。
在 Linux 上就是 flex-bison,其中在使用 bison 时,采用的语法必须是上下文无关文法 (context-free grammar)。
这里简单介绍,包括常规表达式、声明、匹配模式、变量、Yacc 语法和解析器代码。
- 基本概念 关于词法语法分析的基本概念,例如 BNF、上下文无关等。
- Flex 使用简介 词法解析器的介绍,在 Linux 中的实现。
- Bison 使用简介 语法解析器的介绍,Linux 中对应 Yacc 的实现。
- MySQL 语法解析 MySQL 中使用方式,词法解析独立实现,语法分析则使用 Bison 。
时间相关
人们对于时间的认知随着时间的变化一直在变,包括各个地区古代的历法,以及最新的原子钟,而且现代仍然有闰秒、冬令时、夏令时等等各种概念。
在 Linux 系统中,包括了时区的设置、时间的同步、闰秒的影响等等。
- 基本概念 与时间相关的基本概念以及设置,例如时区、闰秒、夏令时等。
- 时间函数 介绍下 Linux 中与时间相关的函数以及如何选择。
- NTP 介绍 主要是一些基本概念、如何配置等介绍。
- 闰秒介绍 一些与闰秒相关的介绍,包括了基本概念、如何规避等。
LLVM
最初是 Low Level Virtual Machine 的缩写,不过随着发展,逐渐整合成了一整套的编译工具,所以官方也就放弃了原有的缩写,而修改成 The LLVM Compiler Infrastructure 。
其强大之处在于模块化,可以很方便适配不同的语言以及硬件平台。
- 基本介绍 这里简单介绍其常见的使用方法,包括安装、常用命令等。