C语言代码片段总结

#pragma为C语言预处理宏。可用#pragma pack(N)指定结构体N字节对齐。
1字节对齐:

1
2
3
4
5
6
7
8
9
10
11
#pragma pack(push)
#pragma pack(1)
// 头部
struct header_t {
uint8_t word1;
uint8_t word2;
uint8_t cmd;
uint16_t len;
};

#pragma pack(pop)

GCC编译器扩展形式,1字节对齐:

1
2
3
4
5
6
7
// 头部
struct header_t {
uint8_t word1;
uint8_t word2;
uint8_t cmd;
uint16_t len;
} __attribute__((packed));

Linux系统C/C++通用错误码实现模板

背景公司C++项目初期是安排不同的人编写不同的模块,有嵌入式ARM的,有socket协议的,有mysql的,有redis的,不同人风格不同。由于当时我还在运维小组搞docker,没参与规则的制定,后来接手时,开始确定编码规范,也建立了Git管理(Git尝试过sub modules,不过太过繁琐,最终弃用了),由于历史原因,后面要不断重构代码。

阅读全文>>

遇到一个valgrind自身的bug

背景公司C++项目代码使用了cppcheck做静态代码检查,也使用valgrind检查是否有内存泄漏问题。我多次强调要做到0警告,虽然有了CICD的Jenkins自动检查,也将结果通过邮件发给项目人员,但有的人还是没去修正警告,由于不是自己管辖范围,不好多说什么。最近使用valgrind测试,遇到了未识别指令的问题(运行的程序被认为是非法指令)。经查发现是valgrind版本太低造成的。

阅读全文>>

我的docker随笔16:构建一个特定的nodejs镜像

一、背景某网友需要对区块链交易的项目进行测试。测试脚本需要在nodejs环境中运行,脚本有server.js、package.json,主要依赖包为web3(当然还是其它的)。为方便测试,较好的解决方案是利用docker搭建环境。本文在ubuntu 16.04上进行实验。

阅读全文>>

linux系统C语言实现域名解析功能

背景后台项目划分几个小服务,分别部署到不同的docker容器中,不同服务通过socket连接,docker的IP地址是由dockerd自动分配的,当然,也可以固定IP,但这样不好。因此,为了方便部署和维护,考虑通过容器别名的方式。容器名通过ini配置文件传递到程序里,程序需要根据容器名解析出对应的IP地址。于是找了些实现域名解析的方法。

阅读全文>>