当前位置: 技术问答>linux和unix
strerror是如何实现的
来源: 互联网 发布时间:2016-04-20
本文导语: 今天看UNIX环境高级编程第二版,程序1-6是两个出错函数的使用方法,其中一个函数是strerror,它能从错误号得到错误描述字符串,我对它产生了兴趣,我估计应该有一个以错误号为索引的字符串数组,于是我去查strerr...
今天看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 ";
print "#include ";
print "#include ";
print "#define static static const";
nsubs = split(subsys, subs);
while (nsubs > 0) printf "#include "%s"n", subs[nsubs--];
print "nn
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);";
}
BEGIN {
print "#include ";
print "#include ";
print "#include ";
print "#define static static const";
nsubs = split(subsys, subs);
while (nsubs > 0) printf "#include "%s"n", subs[nsubs--];
print "nn
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);";
}
|
楼主的想法不错, 用"以错误号为索引的字符串数组"确实可以实现,
俺没有研究过glibc,
不过楼主可以看看这个实现:
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/gen/errlst.c?rev=1.8.12.1;content-type=text%2Fplain
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/strerror.c?rev=1.15.12.1;content-type=text%2Fplain
俺没有研究过glibc,
不过楼主可以看看这个实现:
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/gen/errlst.c?rev=1.8.12.1;content-type=text%2Fplain
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/strerror.c?rev=1.15.12.1;content-type=text%2Fplain
|
#include
#include
#include
//看这个
int main(void)
{
int fd;
extern int errno;
if((fd = open("no/such/file",0))
#include
#include
//看这个
int main(void)
{
int fd;
extern int errno;
if((fd = open("no/such/file",0))
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
站内导航:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!