• 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux

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);";
}
...全文
582 点赞 收藏 2
写回复
2 条回复
mymtom 2008年10月23日
楼主的想法不错, 用"以错误号为索引的字符串数组"确实可以实现,
俺没有研究过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
回复 点赞
dota_1234 2008年10月22日
#include <stdio.h>
#include <string.h>
#include <errno.h>
//看这个
int main(void)
{
int fd;
extern int errno;

if((fd = open("no/such/file",0)) < 0)
{
printf("errno=%d\n",errno);
char * mesg = strerror(errno);
printf("Mesg:%s\n",mesg);
}

exit(0);
}


回复 点赞
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

7065

社区成员

7.3w+

社区内容

Linux/Unix社区 应用程序开发区
社区公告
暂无公告