当前位置:  技术问答>linux和unix

errno变量问题

    来源: 互联网  发布时间:2015-12-29

    本文导语:  我想问一下,errno全局变量是在哪个文件中“定义”的? 注意,我说的是“定义”,而非“声明”,因为errno的声明我已经在一个头文件中找到了(好像是errno.h,记不清了): extern int errno; 但是没有找到“定义”。...

我想问一下,errno全局变量是在哪个文件中“定义”的?
注意,我说的是“定义”,而非“声明”,因为errno的声明我已经在一个头文件中找到了(好像是errno.h,记不清了):
extern int errno;
但是没有找到“定义”。

我想,是不是操作系统在加载每个程序的时候为每个程序定义的这个全局errno变量?

望指教,谢谢。

|
每个线程一个errno,而不是程序(或者准确的说,进程)。C标准中说明了它的规范,由编译器实现。可能由宏定义来实现。

The  integer  errno is set by system calls (and some library functions) to indicate what went wrong.  Its value
       is significant only when the call returned an error (usually -1), and a library function that does  succeed  is
       allowed to change errno.

       Sometimes, when -1 is also a legal return value one has to zero errno before the call in order to detect possi-
       ble errors.

       errno is defined by the ISO C standard to be a modifiable lvalue of  type  int,  and  must  not  be  explicitly
       declared;  errno  may be a macro.  errno is thread-local; setting it in one thread does not affect its value in
       any other thread.

       Valid error numbers are all non-zero; errno is never set to zero by any library function.  All the error  names
       specified by POSIX.1 must have distinct values.

       POSIX.1  (2001  edition)  lists the following symbolic error names.  Of these, EDOM and ERANGE are in the ISO C
       standard.  ISO C Amendment 1 defines the additional error number EILSEQ for coding errors in multibyte or  wide
       characters.

|
简单的说,errno在标准C中是一个整型变量,在errno.h中声明,C标准库中实现。多线程技术中,为了使errno线程安全,使用宏定义替代了简单的extern int errno声明。man errno, 再看看C99标准文档,就明白了。

---选自/usr/include/bits/errno.h------
//当使用多线程时,errno是个宏定义
#  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 */

----选择/usr/include/errno.h-------
//标准的errno定义,在errno.h中声明,libc标准库中实现定义。
/* Declare the `errno' variable, unless it's defined as a macro by
   bits/errno.h.  This is the case in GNU, where it is a per-thread
   variable.  This redeclaration using the macro still works, but it
   will be a function declaration without a prototype and may trigger
   a -Wstrict-prototypes warning.  */
#ifndef errno
extern int errno;
#endif

以下是C99标准对errno.h的说明:(从PDF中拷的,格式混乱,凑合看一下....)
7.5 Errors1The header  de?nes several macros, all relating to the reporting of errorconditions.2The macros areEDOMEILSEQERANGEwhich expand to integer constant expressions with typeint,distinct positive values, andwhich are suitable for use in#ifpreprocessing directives; anderrnowhich expands to a modi?able lvalue169)that has typeint,the value of which is set to apositive error number by several library functions. It is unspeci?ed whethererrnois amacro or an identi?er declared with external linkage. If a macro de?nition is suppressedin order to access an actual object, or a program de?nes an identi?er with the nameerrno,the behavior is unde?ned.3The value of errno is zero at program startup, but is never set to zero by any libraryfunction.170)The value of errno may be set to nonzero by a library function callwhether or not there is an error, provided the use of errno is not documented in thedescription of the function in this International Standard.4Additional macro de?nitions, beginning with E and a digit or E and an uppercaseletter,171)may also be speci?ed by the implementation.

|
标准库中实现.对于gcc来讲,应该就是在glibc中实现的定义.

|
应该是在被使用(设置)的时候定义的

|
extern int errno找不到?用的什么操作系统?

|
gcc不同的版本定义不一样的,是一个易失变量
你#include 就可以了不要再自己extern int errno;
画蛇添足。

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












  • 相关文章推荐
  • unix 下的socket 函数调用失败会写 errno. 哪位有 errno 的值 和 其对应意义 的 对照表???
  • 怎样才能知道UNIX 下C语言的ERRNO都代表什么意思?到哪里去查,别外怎样在程序中截获这个errno我好做相应的处理。
  • 使用errno要不要加头文件?
  • 对于多线程而言,errno是不是不可靠啊?有什么解决办法没?
  • errno是个全局的马〉?还是一个线程一个?
  • linux多线程下可以直接使用errno吗?
  • sendto,总是返回-1,查看errno说是EPERM
  • 急问socket编程:程序中执行sendto()返回errno=101是什么原因啊
  • Linux 动态库 dlopen()失败,errno = 17, File exists
  • 请问:SCO UNIX下SOCKET的recv返回-1,errno=9?在线等·····
  • 请教高手,linux下使用libusb_submit_transfer,返回-1,errno = 16,如何解决?
  • 如何根据errno得到文件名
  • Connect函数在出现错误时返回-1,并且设置errno为相应的错误码
  • socket连接函数connect()返回错误 errno 为 115,什么原因?谢谢
  • linux 编写内核函数errno
  • kmod:failed to exec/sbin/modprobe -s -k binfmt-0000 ,errno=8
  • connect失败,errno为115.请问怎么解决?
  • 权限够却莫名其妙报strerror(errno)=Permission denied
  • [Solaris/AIX] read()调用失败,errno为ECONNECTIONRESET,请点解一下大致会是一些什么原因?
  • 怎么老是出现sys_errlist[]与errno sys_nerr 类型不同一 回复者必有分


  • 站内导航:


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

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

    浙ICP备11055608号-3