当前位置:  技术问答>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);";
}

|
楼主的想法不错, 用"以错误号为索引的字符串数组"确实可以实现,
俺没有研究过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)) 

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 权限够却莫名其妙报strerror(errno)=Permission denied
  • perror和strerror怎么获取的错误不一致.
  • 在inter版solaris 8上编socket程序,在read时遇到错误,错误号14,用strerror()看不到错误描述,请解决,多谢!
  • accept 返回 22 的错误,strerror为:Invalid argument, 救命呀,什么原因


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3