当前位置: 技术问答>linux和unix
errno是个全局的马〉?还是一个线程一个?
来源: 互联网 发布时间:2015-11-29
本文导语: ruti | 断刀is right. | errno is thread-local; setting it in one thread does not affect its value in any other thread. | 是全局的,但是是线程安全的,每个线程(进程)空间...
ruti
|
断刀is right.
|
errno is thread-local; setting it in one thread does not affect its value in any other thread.
|
是全局的,但是是线程安全的,每个线程(进程)空间内会有一个独立的errno
|
仔细看一下errno.h,原来是有一个开关的(根据系统不同,此头文件的定义可能有所不同)。
#ifdef _REENTRANT
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
#ifdef _PROTOTYPES
extern int *__errno(void);
#else
extern int *__errno();
#endif
#define errno (*__errno())
# ifdef __cplusplus
}
# endif /* __cplusplus */
#else
extern int errno;
#endif
如果未定义宏_REENTRANT(可重入的意思),则errno当作一个全局变量处理。假如你的程序是多线程的,则应当定义_REENTRANT宏,那么errno将被扩展为一个函数,该函数将访问线程局部存储的错误码。
#ifdef _REENTRANT
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
#ifdef _PROTOTYPES
extern int *__errno(void);
#else
extern int *__errno();
#endif
#define errno (*__errno())
# ifdef __cplusplus
}
# endif /* __cplusplus */
#else
extern int errno;
#endif
如果未定义宏_REENTRANT(可重入的意思),则errno当作一个全局变量处理。假如你的程序是多线程的,则应当定义_REENTRANT宏,那么errno将被扩展为一个函数,该函数将访问线程局部存储的错误码。
|
errno是多线程安全的,即一个线程一个。