strerror是如何实现的
一小猿 2008-07-26 12:49:59 今天看UNIX环境高级编程第二版,程序1-6是两个出错函数的使用方法,其中一个函数是strerror,它能从错误号得到错误描述字符串,我对它产生了兴趣,我估计应该有一个以错误号为索引的字符串数组,于是我去查strerror的源码,我用的源码是glibc2.7,用ultraedit在文件夹中递归查找到strerror,发现它调用了__strerror_r,函数长度大约100行,本人功力实在有限,看不太懂,但注意到函数返回语句return (char *) _(es->subsystem[sub].codes[code]);其中es的定义是const struct error_system *es;而es是从这句来的es = &__mach_error_systems[system];这让我很意外,居然是一个三维数组,未免太复杂了,我想这个数组一定是静态的,但我没有找到这个三维数组的定义;在搜索__mach_error_systems时,发现它跟一个叫errsystems.awk的文件有关,可是我又看不懂它,内容如下:
BEGIN {
print "#include <errno.h>";
print "#include <mach/error.h>";
print "#include <errorlib.h>";
print "#define static static const";
nsubs = split(subsys, subs);
while (nsubs > 0) printf "#include \"%s\"\n", subs[nsubs--];
print "\n\n\
const struct error_system __mach_error_systems[err_max_system + 1] =";
print " {";
}
/^static.*err_[a-z0-9A-Z_]+_sub *\[/ {
s = $0; sub(/^.*err_/, "", s); sub(/_sub.*$/, "", s);
printf " [err_get_system (err_%s)] = { errlib_count (err_%s_sub),",
s, s;
printf "\"(system %s) error with unknown subsystem\", err_%s_sub },\n",
s, s;
}
END {
print " };";
print "\n\
const int __mach_error_system_count = errlib_count (__mach_error_systems);";
}