免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8971 | 回复: 10
打印 上一主题 下一主题

[C] errno的实现方式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-12 09:45 |只看该作者 |倒序浏览
20可用积分
大家好,unix里有个errno,当调用一个函数时,如果出错,errno经常会给出出错代码。
但是这个errno变量是在哪定义的呢,查看errno.h里面的定义:
#if defined(_THREAD_SAFE) || defined(_THREAD_SAFE_ERRNO)
/*
* Per thread errno is provided by the threads provider. Both the extern int
* and the per thread value must be maintained by the threads library.
*/
extern        int        *_Errno( void );
#define errno        (*_Errno())

#else

extern int errno;

#endif        /* _THREAD_SAFE || _THREAD_SAFE_ERRNO */

从这里可以看到,在errno.h文件里,它只是用extern引用外部变量,那么errno变量到底是在哪定义了呢?
谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-02-12 09:54 |只看该作者
errno.c
-_-!!

论坛徽章:
0
3 [报告]
发表于 2009-02-12 09:57 |只看该作者
errno实际上是个函数

# ifndef __ASSEMBLER__
/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));

#  if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())
#  endif
# endif /* !__ASSEMBLER__ */
#endif /* _ERRNO_H */

[ 本帖最后由 veking 于 2009-2-12 10:00 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-12 10:01 |只看该作者
你找到的是不是这个/usr/include/errno.h
而你想要的可能是这个/usr/include/asm-generic/errno.h (FC6下已测)
这里面定义了一些关于错误代码的宏定义
#ifndef _ASM_GENERIC_ERRNO_H
#define _ASM_GENERIC_ERRNO_H

#include <asm-generic/errno-base.h>

#define&nbsp;&nbsp;&nbsp;&nbsp;EDEADLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;35&nbsp;&nbsp;&nbsp;&nbsp;/* Resource deadlock would occur */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENAMETOOLONG&nbsp;&nbsp;&nbsp;&nbsp;36&nbsp;&nbsp;&nbsp;&nbsp;/* File name too long */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOLCK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;37&nbsp;&nbsp;&nbsp;&nbsp;/* No record locks available */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOSYS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;38&nbsp;&nbsp;&nbsp;&nbsp;/* Function not implemented */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOTEMPTY&nbsp;&nbsp;&nbsp;&nbsp;39&nbsp;&nbsp;&nbsp;&nbsp;/* Directory not empty */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELOOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;/* Too many symbolic links encountered */
#define&nbsp;&nbsp;&nbsp;&nbsp;EWOULDBLOCK&nbsp;&nbsp;&nbsp;&nbsp;EAGAIN&nbsp;&nbsp;&nbsp;&nbsp;/* Operation would block */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42&nbsp;&nbsp;&nbsp;&nbsp;/* No message of desired type */
#define&nbsp;&nbsp;&nbsp;&nbsp;EIDRM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;43&nbsp;&nbsp;&nbsp;&nbsp;/* Identifier removed */
#define&nbsp;&nbsp;&nbsp;&nbsp;ECHRNG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;44&nbsp;&nbsp;&nbsp;&nbsp;/* Channel number out of range */
#define&nbsp;&nbsp;&nbsp;&nbsp;EL2NSYNC&nbsp;&nbsp;&nbsp;&nbsp;45&nbsp;&nbsp;&nbsp;&nbsp;/* Level 2 not synchronized */
#define&nbsp;&nbsp;&nbsp;&nbsp;EL3HLT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;46&nbsp;&nbsp;&nbsp;&nbsp;/* Level 3 halted */
#define&nbsp;&nbsp;&nbsp;&nbsp;EL3RST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;47&nbsp;&nbsp;&nbsp;&nbsp;/* Level 3 reset */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELNRNG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;/* Link number out of range */
#define&nbsp;&nbsp;&nbsp;&nbsp;EUNATCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;49&nbsp;&nbsp;&nbsp;&nbsp;/* Protocol driver not attached */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOCSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;/* No CSI structure available */
#define&nbsp;&nbsp;&nbsp;&nbsp;EL2HLT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;/* Level 2 halted */
#define&nbsp;&nbsp;&nbsp;&nbsp;EBADE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;52&nbsp;&nbsp;&nbsp;&nbsp;/* Invalid exchange */
#define&nbsp;&nbsp;&nbsp;&nbsp;EBADR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;53&nbsp;&nbsp;&nbsp;&nbsp;/* Invalid request descriptor */
#define&nbsp;&nbsp;&nbsp;&nbsp;EXFULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;/* Exchange full */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOANO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;/* No anode */
#define&nbsp;&nbsp;&nbsp;&nbsp;EBADRQC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;/* Invalid request code */
#define&nbsp;&nbsp;&nbsp;&nbsp;EBADSLT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;/* Invalid slot */

#define&nbsp;&nbsp;&nbsp;&nbsp;EDEADLOCK&nbsp;&nbsp;&nbsp;&nbsp;EDEADLK

#define&nbsp;&nbsp;&nbsp;&nbsp;EBFONT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;/* Bad font file format */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;/* Device not a stream */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENODATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;61&nbsp;&nbsp;&nbsp;&nbsp;/* No data available */
#define&nbsp;&nbsp;&nbsp;&nbsp;ETIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;62&nbsp;&nbsp;&nbsp;&nbsp;/* Timer expired */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;63&nbsp;&nbsp;&nbsp;&nbsp;/* Out of streams resources */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENONET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;/* Machine is not on the network */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOPKG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;65&nbsp;&nbsp;&nbsp;&nbsp;/* Package not installed */
#define&nbsp;&nbsp;&nbsp;&nbsp;EREMOTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;66&nbsp;&nbsp;&nbsp;&nbsp;/* Object is remote */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOLINK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;67&nbsp;&nbsp;&nbsp;&nbsp;/* Link has been severed */
#define&nbsp;&nbsp;&nbsp;&nbsp;EADV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;68&nbsp;&nbsp;&nbsp;&nbsp;/* Advertise error */
#define&nbsp;&nbsp;&nbsp;&nbsp;ESRMNT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;69&nbsp;&nbsp;&nbsp;&nbsp;/* Srmount error */
#define&nbsp;&nbsp;&nbsp;&nbsp;ECOMM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;70&nbsp;&nbsp;&nbsp;&nbsp;/* Communication error on send */
#define&nbsp;&nbsp;&nbsp;&nbsp;EPROTO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;71&nbsp;&nbsp;&nbsp;&nbsp;/* Protocol error */
#define&nbsp;&nbsp;&nbsp;&nbsp;EMULTIHOP&nbsp;&nbsp;&nbsp;&nbsp;72&nbsp;&nbsp;&nbsp;&nbsp;/* Multihop attempted */
#define&nbsp;&nbsp;&nbsp;&nbsp;EDOTDOT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;73&nbsp;&nbsp;&nbsp;&nbsp;/* RFS specific error */
#define&nbsp;&nbsp;&nbsp;&nbsp;EBADMSG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;74&nbsp;&nbsp;&nbsp;&nbsp;/* Not a data message */
#define&nbsp;&nbsp;&nbsp;&nbsp;EOVERFLOW&nbsp;&nbsp;&nbsp;&nbsp;75&nbsp;&nbsp;&nbsp;&nbsp;/* Value too large for defined data type */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOTUNIQ&nbsp;&nbsp;&nbsp;&nbsp;76&nbsp;&nbsp;&nbsp;&nbsp;/* Name not unique on network */
#define&nbsp;&nbsp;&nbsp;&nbsp;EBADFD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;77&nbsp;&nbsp;&nbsp;&nbsp;/* File descriptor in bad state */
#define&nbsp;&nbsp;&nbsp;&nbsp;EREMCHG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;78&nbsp;&nbsp;&nbsp;&nbsp;/* Remote address changed */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELIBACC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;79&nbsp;&nbsp;&nbsp;&nbsp;/* Can not access a needed shared library */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELIBBAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;&nbsp;&nbsp;&nbsp;/* Accessing a corrupted shared library */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELIBSCN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp;&nbsp;&nbsp;/* .lib section in a.out corrupted */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELIBMAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;82&nbsp;&nbsp;&nbsp;&nbsp;/* Attempting to link in too many shared libraries */
#define&nbsp;&nbsp;&nbsp;&nbsp;ELIBEXEC&nbsp;&nbsp;&nbsp;&nbsp;83&nbsp;&nbsp;&nbsp;&nbsp;/* Cannot exec a shared library directly */
#define&nbsp;&nbsp;&nbsp;&nbsp;EILSEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;84&nbsp;&nbsp;&nbsp;&nbsp;/* Illegal byte sequence */
#define&nbsp;&nbsp;&nbsp;&nbsp;ERESTART&nbsp;&nbsp;&nbsp;&nbsp;85&nbsp;&nbsp;&nbsp;&nbsp;/* Interrupted system call should be restarted */
#define&nbsp;&nbsp;&nbsp;&nbsp;ESTRPIPE&nbsp;&nbsp;&nbsp;&nbsp;86&nbsp;&nbsp;&nbsp;&nbsp;/* Streams pipe error */
#define&nbsp;&nbsp;&nbsp;&nbsp;EUSERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;87&nbsp;&nbsp;&nbsp;&nbsp;/* Too many users */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOTSOCK&nbsp;&nbsp;&nbsp;&nbsp;88&nbsp;&nbsp;&nbsp;&nbsp;/* Socket operation on non-socket */
#define&nbsp;&nbsp;&nbsp;&nbsp;EDESTADDRREQ&nbsp;&nbsp;&nbsp;&nbsp;89&nbsp;&nbsp;&nbsp;&nbsp;/* Destination address required */
#define&nbsp;&nbsp;&nbsp;&nbsp;EMSGSIZE&nbsp;&nbsp;&nbsp;&nbsp;90&nbsp;&nbsp;&nbsp;&nbsp;/* Message too long */
#define&nbsp;&nbsp;&nbsp;&nbsp;EPROTOTYPE&nbsp;&nbsp;&nbsp;&nbsp;91&nbsp;&nbsp;&nbsp;&nbsp;/* Protocol wrong type for socket */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOPROTOOPT&nbsp;&nbsp;&nbsp;&nbsp;92&nbsp;&nbsp;&nbsp;&nbsp;/* Protocol not available */
#define&nbsp;&nbsp;&nbsp;&nbsp;EPROTONOSUPPORT&nbsp;&nbsp;&nbsp;&nbsp;93&nbsp;&nbsp;&nbsp;&nbsp;/* Protocol not supported */
#define&nbsp;&nbsp;&nbsp;&nbsp;ESOCKTNOSUPPORT&nbsp;&nbsp;&nbsp;&nbsp;94&nbsp;&nbsp;&nbsp;&nbsp;/* Socket type not supported */
#define&nbsp;&nbsp;&nbsp;&nbsp;EOPNOTSUPP&nbsp;&nbsp;&nbsp;&nbsp;95&nbsp;&nbsp;&nbsp;&nbsp;/* Operation not supported on transport endpoint */
#define&nbsp;&nbsp;&nbsp;&nbsp;EPFNOSUPPORT&nbsp;&nbsp;&nbsp;&nbsp;96&nbsp;&nbsp;&nbsp;&nbsp;/* Protocol family not supported */
#define&nbsp;&nbsp;&nbsp;&nbsp;EAFNOSUPPORT&nbsp;&nbsp;&nbsp;&nbsp;97&nbsp;&nbsp;&nbsp;&nbsp;/* Address family not supported by protocol */
#define&nbsp;&nbsp;&nbsp;&nbsp;EADDRINUSE&nbsp;&nbsp;&nbsp;&nbsp;98&nbsp;&nbsp;&nbsp;&nbsp;/* Address already in use */
#define&nbsp;&nbsp;&nbsp;&nbsp;EADDRNOTAVAIL&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;/* Cannot assign requested address */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENETDOWN&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;&nbsp;&nbsp;/* Network is down */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENETUNREACH&nbsp;&nbsp;&nbsp;&nbsp;101&nbsp;&nbsp;&nbsp;&nbsp;/* Network is unreachable */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENETRESET&nbsp;&nbsp;&nbsp;&nbsp;102&nbsp;&nbsp;&nbsp;&nbsp;/* Network dropped connection because of reset */
#define&nbsp;&nbsp;&nbsp;&nbsp;ECONNABORTED&nbsp;&nbsp;&nbsp;&nbsp;103&nbsp;&nbsp;&nbsp;&nbsp;/* Software caused connection abort */
#define&nbsp;&nbsp;&nbsp;&nbsp;ECONNRESET&nbsp;&nbsp;&nbsp;&nbsp;104&nbsp;&nbsp;&nbsp;&nbsp;/* Connection reset by peer */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOBUFS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;105&nbsp;&nbsp;&nbsp;&nbsp;/* No buffer space available */
#define&nbsp;&nbsp;&nbsp;&nbsp;EISCONN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;106&nbsp;&nbsp;&nbsp;&nbsp;/* Transport endpoint is already connected */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOTCONN&nbsp;&nbsp;&nbsp;&nbsp;107&nbsp;&nbsp;&nbsp;&nbsp;/* Transport endpoint is not connected */
#define&nbsp;&nbsp;&nbsp;&nbsp;ESHUTDOWN&nbsp;&nbsp;&nbsp;&nbsp;108&nbsp;&nbsp;&nbsp;&nbsp;/* Cannot send after transport endpoint shutdown */
#define&nbsp;&nbsp;&nbsp;&nbsp;ETOOMANYREFS&nbsp;&nbsp;&nbsp;&nbsp;109&nbsp;&nbsp;&nbsp;&nbsp;/* Too many references: cannot splice */
#define&nbsp;&nbsp;&nbsp;&nbsp;ETIMEDOUT&nbsp;&nbsp;&nbsp;&nbsp;110&nbsp;&nbsp;&nbsp;&nbsp;/* Connection timed out */
#define&nbsp;&nbsp;&nbsp;&nbsp;ECONNREFUSED&nbsp;&nbsp;&nbsp;&nbsp;111&nbsp;&nbsp;&nbsp;&nbsp;/* Connection refused */
#define&nbsp;&nbsp;&nbsp;&nbsp;EHOSTDOWN&nbsp;&nbsp;&nbsp;&nbsp;112&nbsp;&nbsp;&nbsp;&nbsp;/* Host is down */
#define&nbsp;&nbsp;&nbsp;&nbsp;EHOSTUNREACH&nbsp;&nbsp;&nbsp;&nbsp;113&nbsp;&nbsp;&nbsp;&nbsp;/* No route to host */
#define&nbsp;&nbsp;&nbsp;&nbsp;EALREADY&nbsp;&nbsp;&nbsp;&nbsp;114&nbsp;&nbsp;&nbsp;&nbsp;/* Operation already in progress */
#define&nbsp;&nbsp;&nbsp;&nbsp;EINPROGRESS&nbsp;&nbsp;&nbsp;&nbsp;115&nbsp;&nbsp;&nbsp;&nbsp;/* Operation now in progress */
#define&nbsp;&nbsp;&nbsp;&nbsp;ESTALE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;116&nbsp;&nbsp;&nbsp;&nbsp;/* Stale NFS file handle */
#define&nbsp;&nbsp;&nbsp;&nbsp;EUCLEAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;117&nbsp;&nbsp;&nbsp;&nbsp;/* Structure needs cleaning */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOTNAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;118&nbsp;&nbsp;&nbsp;&nbsp;/* Not a XENIX named type file */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENAVAIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;119&nbsp;&nbsp;&nbsp;&nbsp;/* No XENIX semaphores available */
#define&nbsp;&nbsp;&nbsp;&nbsp;EISNAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;&nbsp;&nbsp;/* Is a named type file */
#define&nbsp;&nbsp;&nbsp;&nbsp;EREMOTEIO&nbsp;&nbsp;&nbsp;&nbsp;121&nbsp;&nbsp;&nbsp;&nbsp;/* Remote I/O error */
#define&nbsp;&nbsp;&nbsp;&nbsp;EDQUOT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;122&nbsp;&nbsp;&nbsp;&nbsp;/* Quota exceeded */

#define&nbsp;&nbsp;&nbsp;&nbsp;ENOMEDIUM&nbsp;&nbsp;&nbsp;&nbsp;123&nbsp;&nbsp;&nbsp;&nbsp;/* No medium found */
#define&nbsp;&nbsp;&nbsp;&nbsp;EMEDIUMTYPE&nbsp;&nbsp;&nbsp;&nbsp;124&nbsp;&nbsp;&nbsp;&nbsp;/* Wrong medium type */
#define&nbsp;&nbsp;&nbsp;&nbsp;ECANCELED&nbsp;&nbsp;&nbsp;&nbsp;125&nbsp;&nbsp;&nbsp;&nbsp;/* Operation Canceled */
#define&nbsp;&nbsp;&nbsp;&nbsp;ENOKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;126&nbsp;&nbsp;&nbsp;&nbsp;/* Required key not available */
#define&nbsp;&nbsp;&nbsp;&nbsp;EKEYEXPIRED&nbsp;&nbsp;&nbsp;&nbsp;127&nbsp;&nbsp;&nbsp;&nbsp;/* Key has expired */
#endif

还有论坛里面好像有人问过类似的问题:
http://www.chinaunix.net/index.p ... ead.php?tid=1366588

[ 本帖最后由 flyingtime 于 2009-2-12 10:17 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-02-12 10:05 |只看该作者
楼上的有人说对了吗,我怎么都看不懂。。。。

论坛徽章:
0
6 [报告]
发表于 2009-02-12 10:08 |只看该作者

回复 #4 flyingtime 的帖子

楼主是要问errno是如何实现的,不是找错误宏定义。

贴一个更全一点的吧

/usr/include/bits/errno.h

  1. /* Error constants.  Linux specific version.
  2.    Copyright (C) 1996, 1997, 1998, 1999, 2005 Free Software Foundation, Inc.
  3.    This file is part of the GNU C Library.

  4.    The GNU C Library is free software; you can redistribute it and/or
  5.    modify it under the terms of the GNU Lesser General Public
  6.    License as published by the Free Software Foundation; either
  7.    version 2.1 of the License, or (at your option) any later version.

  8.    The GNU C Library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Lesser General Public License for more details.

  12.    You should have received a copy of the GNU Lesser General Public
  13.    License along with the GNU C Library; if not, write to the Free
  14.    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  15.    02111-1307 USA.  */

  16. #ifdef _ERRNO_H

  17. # undef EDOM
  18. # undef EILSEQ
  19. # undef ERANGE
  20. # include <linux/errno.h>

  21. /* Linux has no ENOTSUP error code.  */
  22. # define ENOTSUP EOPNOTSUPP

  23. /* Older Linux versions also had no ECANCELED error code.  */
  24. # ifndef ECANCELED
  25. #  define ECANCELED        125
  26. # endif

  27. /* Support for error codes to support robust mutexes was added later, too.  */
  28. # ifndef EOWNERDEAD
  29. #  define EOWNERDEAD                130
  30. #  define ENOTRECOVERABLE        131
  31. # endif

  32. # ifndef __ASSEMBLER__
  33. /* Function to get address of global `errno' variable.  */
  34. extern int *__errno_location (void) __THROW __attribute__ ((__const__));

  35. #  if !defined _LIBC || defined _LIBC_REENTRANT
  36. /* When using threads, errno is a per-thread value.  */
  37. #   define errno (*__errno_location ())
  38. #  endif
  39. # endif /* !__ASSEMBLER__ */
  40. #endif /* _ERRNO_H */

  41. #if !defined _ERRNO_H && defined __need_Emath
  42. /* This is ugly but the kernel header is not clean enough.  We must
  43.    define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
  44.    defined.  */
  45. # define EDOM        33        /* Math argument out of domain of function.  */
  46. # define EILSEQ        84        /* Illegal byte sequence.  */
  47. # define ERANGE        34        /* Math result not representable.  */
  48. #endif /* !_ERRNO_H && __need_Emath */
复制代码

[ 本帖最后由 veking 于 2009-2-12 10:11 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-02-12 10:09 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2009-02-12 10:45 |只看该作者

如果要模拟的话……

如果要模拟的话,线程私有数据。这个可以实现类似的效果。
M$的M!uqom2(Windows 的倒影,不系么 )上交所线程局部存储,什么TLS还是TLS什么的,google以下便知。pthread也是支持的,但换了个称谓。
其实可以分析一下线程数据头~~~~

[ 本帖最后由 swxlion 于 2009-2-12 10:47 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-02-12 16:14 |只看该作者
如果只用于单线程环境,那么可以直接定义errno为一个全局变量
如果需要用于多线程环境(即每一个线程都能够保存该线程的错误代码),那么errno一般实现为宏,该宏去调用一个线程安全的函数(此时,一般通过线程局部存储(TLS)变量来保存该错误代码)

现在,回答LZ的疑问:
从这里可以看到,在errno.h文件里,它只是用extern引用外部变量,那么errno变量到底是在哪定义了呢?
谢谢!

如果是全局变量实现方式,那么errno变量的定义在标准库文件中(已经编译为二进制库了,所以你看不到)
如果是宏+函数实现方式,那么不存在errno变量

最后,解释一下,宏的方式为什么是类似如下方式实现:

  1. extern        int        *_Errno( void );
  2. #define errno        (*_Errno())
复制代码

因为标准库规定了必须能够通过&errno方式取得保存错误代码的变量的地址,因此_Errno函数的返回值是指针,并把宏定义为解引用函数返回的地址*_Errno()。如果_Errno直接返回int类型,此时就无法取得保存错误代码的变量的地址。

论坛徽章:
0
10 [报告]
发表于 2009-02-12 16:50 |只看该作者
libc
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP