我正在修复一些使用strerror
(非线程安全)进行多线程处理的 Linux 代码。我发现strerror_r
和strerror_l
都是线程安全的。由于strerror_r
的定义不同(取决于_GNU_SOURCE
定义不同),我想使用较新的strerror_l
函数,但是我应该如何获取当前语言环境的locale_t
对象?我没有使用 iconv
或任何东西,只是普通的 libc,而且我不明白如何获取"默认语言环境"对象(我不在乎错误以什么语言打印,我只想要一个人类可读的字符串。
如果将 " 传递给 locale 参数 newlocale 会将一个语言环境对象集分配给当前的本机语言环境[1]
[1]http://pubs.opengroup.org/onlinepubs/9699919799/functions/newlocale.html
static locale_t locale;
bool MyStrerrorInit(void)
{
locale = newlocale(LC_CTYPE_MASK|LC_NUMERIC_MASK|LC_TIME_MASK|LC_COLLATE_MASK|
LC_MONETARY_MASK|LC_MESSAGES_MASK,"",(locale_t)0);
if (locale == (locale_t)0) {
return false;
}
return true;
}
char * MyStrerror(int error)
{
return strerror_l(error, locale);
}
POSIX uselocale
:
strerror_l(errno, uselocale((locate_t)0));