zhuizhuhaomeng Blog

「记录下来,一切都会更容易理解」

再论 C 语言的字符转义

问题来了 虽然 C 语言的语法特性已经是最简单的了,但是作为一个 C 语言的老鸟,免不了还是要栽在 C 语言的大坑里。 最近在做一个项目,需要将多个字符串拼接为 LV 格式的字符串。 这里的 LV 是代表 Length Value 格式,而不是奢侈品的 LV 包包的 LV。 因为子字符串的长度只能小于 256 字节, 因此 L 用一个字节来表示。 比如 “abc” “com” 两个字符...

vs code 使用

自动跳转 vscode 插件好多好多,多到让人头花脑胀。而我最讨厌的就是 C、C++ 无法自动跳转了。 不过还好现在有了 clangd 插件,可以更好的自动跳转了。 虽然插件很好,但是还是配置还是有门槛。 如果是 cmake 系统,应该使用这样的方式 1 cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 如果就只有 Makefile,那么应该使用 ...

使用 git pre-commit hooks 做好代码提交前的检查

每个公司甚至小组都有各种规范,但是有时候又是那么的容易忘记。 这时候试用 git 自带的 commit hooks 可以强制检查,拒绝二次犯错。 比如这个是我的 pre-commit 的钩子 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/sh find t -name "*.t" | xargs grep -E -- "(--- ONLY|--- LAST)" &...

crash caused by vsprintf

我们总会有这样的印象:平常的测试都好好的,该写的用例也都写了,但是在上线前的最后一刻就出问题了,好像是总有一个恶魔在跟我们作对。 这次遇到的是一个进程崩溃的问题 (Segmentation fault (core dumped)),而代码却看起来一点问题也没有,百思不得其解。就是下面的一小段代码,你能找打原因吗? #ifndef MAXSTRINGLEN #define MAXSTRIN...

Add Bridge Interface with nmcli

使用 qemu 创建的虚拟机,宿主机无法和虚拟机互通。 经过分析发现如果将虚拟机和宿主机的网卡都添加到网桥,那么就可以实现虚拟机和宿主机的互通了。 那么如何在将宿主机添加网桥呢? 可以使用下面的命令,这里假设物理网卡的名称是 enp4s0。 这里同时给网桥配置了静态 IP 地址。 1 2 3 4 5 6 7 8 dev=enp4s0 sudo nmcli connection add ...

Nginx location 匹配规则

Nginx 的 location 匹配规则是可以时说是比较灵活的,但是也可以说是比较复杂的。 有些同学总喜欢问一些 奇怪的问题,但是他们不说这些问题背后的场景。 到底是他们必须这么使用还是说他自己做了试验发现不符合自己脑袋中的预期。 比如 “location = /” can not be matched 这个问题。 其实在 Nginx 的官方文档中,对 Location 的匹配规则说...

使用 GDB 跟踪 Lua 内存分配

我们想要了解一个某一个软件的内存是如何分配的,最好的方式就是看看内存分配的函数的调用栈。 我们可以使用 GDB 来跟踪内存的分配和释放。 设置日志输出文件 因为程序都会涉及大量的内存分配和释放,所以我们需要把调试信息导出到文件。 这样我们就可以使用其它工具对导出的日志进一步的分析。 这就涉及 logging 这个命令。 set logging file gdb.log set log...

如何安全拷贝字符串

安全拷贝字符串 很多面谈题喜欢让人回答如何才能安全拷贝字符串。要比较 strcpy 和 strncpy 的区别。 事实上,大多数的面试官是不知道 strncpy 具体是怎么实现,有什么副作用的。 我们通过 man strncpy 可以清楚的看到,strncpy 其实执行了一个 bzero 的动作,也就是将 目标地址空间的内存清 0 了。 char * strncpy(char *res...

使用软件包安装软件或者是通过拷贝的覆盖的方式安装软件

遇到麻烦 做开发的同学都知道,Makefile 会有一个 install 的目标。 我们通过源码安装软件的时候,经常使用 sudo make install 命令直接将软件安装到系统。 在软件开发的过程中,由于需要频繁修改代码并更新程序进行测试,因此也是使用 sudo make install 的方式来安装软件。 但是夜路走多了总会遇到 鬼。有经验的同学可能就会遇到 sudo make ...

OpenResty interacting with Redis from a script

问题 先向 Redis 服务器获取所有数据,然后在客户端操作过滤需要的数据这种方式显然是低效的。 缺点包过: 需要通过网络传输大量的数据 服务端需要编码大量的数据 客户端还需要解码大量的数据 客户端要自己执行行过滤逻辑 如果能让服务端执行过滤,那么上面的问题就可以解决。 这就是为什么 Redis 服务器提供了执行 Lua 脚本的功能。 可以参考 Redis 官方的...