李迟2021年10月知识总结
Posted 李迟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了李迟2021年10月知识总结相关的知识,希望对你有一定的参考价值。
本文为 2021 年 10 月知识总结。
研发编码
C / C++
无。
golang
写了数字签名、数字信封的测试示例,了解了 RSA 、AES 加解密,知道 AES 的密钥长度必须大于16字节。
Docker
无。
Linux
监控指定进程的内存使用情况 shell 脚本memonitor.sh:
#!/bin/bash
PROCESS=myserver
LOGFILE="/tmp/memlog.txt"
#!/bin/bash
# for ((;;))
# while [ 1 ]
while :
do
PID=$(ps aux | grep $PROCESS | grep -v 'grep' | awk 'print $2;')
if [ "$PID" != "" ]; then
echo `date +'%Y-%m-%d %H:%M:%S'` >> "$LOGFILE"
MEM=$(ps aux | grep $PROCESS | grep -v 'grep' | awk 'print $5;')
MEM="ps mem: "$MEM
RSS=$(cat /proc/$PID/status | grep RSS)
echo $PROCESS $MEM $RSS >> "$LOGFILE"
fi
echo "System memory info: " $(cat /proc/meminfo | grep -E 'MemTotal|MemFree|Cached' |grep -v SwapCached|xargs) >> "$LOGFILE"
echo "-------------" >> "$LOGFILE"
sleep 5
done
注:先获取指定进程ID,再进行条件过滤,得到内存占用。另外还打印系统内存的使用情况。
编码其它
Makefile指定运行时动态库路径
一般地,在编译时分别使用-L
和-l
来指定所需动态库的目录和名称。如:
-L/usr/local/curl/lib/ -lcurl
此种情况下,如果没有额外设置环境环境LD_LIBRARY_PATH,也没有在/etc/ld.conf.d/xx.conf
文件中指定目录的话,会提示动态库未找到。为减少麻烦,可以在编译时用-Wl,-rpath
来指定目录(注意其格式),如:
-L/usr/local/curl/lib/ -lcurl -Wl,-rpath=/usr/local/curl/lib/
这样一来,在运行时就不用额外设置目录了。当然,编译环境和运行环境对应的库目录必须相同。
git 分支管理
用 git 开发过程中有关分支的管理和合并等,已初步形成一些方式,但对于个人来说略显麻烦。以 gitlab 为例,默认主分支,当出现新需求,创建feature-xx
分支,开发之,最后合并到主分支,打上标签;当发现 bug 时,创建bugfix-xx
或hotfix-xx
分支,改正之,最后合并到主分支。如果在修改 bug1 分支时,又出现 bug2,则在最新的主分支创建 bug2 分支,分别修改提交。至于合并,目前还未遇到,待后面补充。
git 版本号
对于版本号管理一直没有找到好的方法,但大体上确定为x.y.z
这种形式,版本号的定义,可在 Makefile,可在单独文件,或直接创建文件version.h
来定义,为方便跟踪,有时会添加编译时间。目前有几种:
- 用过脚本计算 git 提交了多少次版本,将其作为小版本号,每次测试通过后需发布时,先提交一次版本,再用该版本编译,这样本地版本和远程仓库版本保持一致。开发人员只需修改大版本号即可。
- 通过编译日期来确定版本号,之前曾经使用这种方式,即版本号固定,如
v1.1.0
,后面添加编译日期,日期即为真正版本号。可用脚本自动生成。 - 手动维护版本号,如当前已发布
v1.0.0
版本,则先修改版本号文件为开发版本,如v1.1.0-devel
,提交一次,此后的开发均使用该版本号,如确定新版本发布,则修改为v1.1.0
。下次迭代开始时,继续修改版本。这种方案需人工介入,如迭代频繁,可能会忘记版本号的修改。 - 与上法类似,但在最后确定发布版本时,再修改版本号。
研发思考
无。
其它研究
集中看了一些 redis 的知识,如缓存雪崩、缓存击穿等概念。但未有足够时间实践,先记概念以便应试。
工作记录
数据长度计算
某工程有写字符串数据到指定文件的模块,一日运维反馈 32 位系统概率性出现写的数据有不完整的现象。经查,的确只在 32 位系统出现,64 位一切正常,并且只有设备重启时概率性出现(否则以全区的体量,早就被投诉了)。较长时间排查跟踪,发现是某个缓存区越界了。问题代码片段如下:
char databuf[60]=0;
sprintf(databuf, "%s/%s,%010d,%010d,%s,0\\n", themouth, theday, writenum1, writenum2, dataTime);
WriteToFile(MIRROR_FILE, databuf, strlen(databuf))
databuf 长度为 60 字节,在某些情况下,sprintf 组装的长度刚好是60字节,此时用 strlen 函数计算长度,在 32 位系统得到的数值是 63(databuf后有额外的字符,其后才是’\\0’),而写入的字符串有换行,因此造成一个错觉,认为写数据不完整,实际上是同一字符串,只是越界了。解决问题比较简单,增加长度即可。
内存泄漏
某工程遇到一个内存泄漏问题。经排查,是因为申请的内在指针被放置于全局 map 变量中,但在循环使用前,调用了 clear 函数清除了 key,但并未释放内存。解决之法十分简单,将其删除即可,经观察,问题解决。
本月做的事及计划
还有一周就考试了,前面浪费了很多时间,需要抽时间出来复习了,否则浪费报名费。等考完了再陪大锤玩。
李迟 2021.10.31 周日
以上是关于李迟2021年10月知识总结的主要内容,如果未能解决你的问题,请参考以下文章