软件开发: 10 2011存档

这一阵子的工作是在给ext4加feature,就是“让ext4的extent length的单位由block变为cluster“。一边写代码一边加测试用例,这个测试用例我就简单的用shell实现的,就用dd命令来写文件。

顺序写的时候还好,等到偏移写(seek一段再write)的时候出了kernel crash,原因是某个extent的length突然变成了0。一开始当然是怀疑我自己哪里写错了,于是加断点,调试,直到我去南京出差周末在宾馆也在调试(感谢马涛同学提供的虚拟机镜像,不然连不上vpn就没法调了),发现事情很神奇:我的extent开始length是2,dd之后还没干别的呢,length就变了,于是终于给dd加了个strace,一看,我的天,dd自己会做ftruncate!而我还没有实现truncate的新feature

这dd真是体贴得我流泪啊,我一直把它当纯write使啊,没想到dd会“智能“的多加一个truncate操作。去翻了一下dd的代码,只要是 of= 一个文件,dd必然会先truncate之,除非带上conv=notrunc。

看来工具不熟就是误事啊。

附dd用法(seek 8k然后write 8k,不要truncate):

dd if=/dev/zero of=/test seek=2 bs=4K count=2 conv=notrunc 
这几天用shell编程做一个简单的自动回归测试,需要用到shell的函数功能,大约是这样:


sum ()
{
    return `expr $1 + $2`
}

sum 3 4
echo $?        #result


一直用的不错,直到今天加了一个case,echo出来的返回值($?)就不对了,set -x调了一番,加法没错,但echo出来就是不对,最后暴力改改,让返回值变为直接 return 1024,咦?echo的东西变了,于是一番google,找到了这篇

原来shell里面函数的返回值是用的errno,而errno只支持0-255,所以如果返回值太大就返回的不对了。

替代方案是干脆用“全局变量”


RES=0

sum ()
{
RES=`expr $1 + $2`
}

sum 133 244
echo $RES
sum 333 444
echo $RES