在errno.h中,这个变量被声明为extern int errno;所以我的问题是,errno在一些调用后检查值是否安全或在多线程代码中使用 perror() 是否安全。这是一个线程安全变量吗?如果没有,那还有什么替代方案?
errno.h
extern int errno;
errno
我在 x86 架构上使用带有 gcc 的 linux。
是的,它是线程安全的。在 Linux 上,全局 errno 变量是线程特定的。POSIX 要求 errno 是线程安全的。
见http://www.unix.org/whitepapers/reentrant.html
在 POSIX.1 中,errno 被定义为外部全局变量。但是这个定义在多线程环境中是不可接受的,因为它的使用会导致不确定的结果。问题是两个或多个线程可能会遇到错误,都会导致设置相同的 errno。在这些情况下,一个线程可能会在它已经被另一个线程更新后检查 errno。 为了规避由此产生的不确定性,POSIX.1c 将 errno 重新定义为可以访问每个线程错误号的服务,如下所示(ISO/IEC 9945:1-1996,搂2.4): 某些函数可能会在通过符号 errno 访问的变量中提供错误号。符号 errno 是通过包含标头来定义的,如 C 标准所规定的……对于进程的每个线程,errno 的值不应受到函数调用或其他线程对 errno 的分配的影响。
在 POSIX.1 中,errno 被定义为外部全局变量。但是这个定义在多线程环境中是不可接受的,因为它的使用会导致不确定的结果。问题是两个或多个线程可能会遇到错误,都会导致设置相同的 errno。在这些情况下,一个线程可能会在它已经被另一个线程更新后检查 errno。
为了规避由此产生的不确定性,POSIX.1c 将 errno 重新定义为可以访问每个线程错误号的服务,如下所示(ISO/IEC 9945:1-1996,搂2.4):
某些函数可能会在通过符号 errno 访问的变量中提供错误号。符号 errno 是通过包含标头来定义的,如 C 标准所规定的……对于进程的每个线程,errno 的值不应受到函数调用或其他线程对 errno 的分配的影响。
另见http://linux.die.net/man/3/errno
errno 是线程本地的;在一个线程中设置它不会影响它在任何其他线程中的值。