c - 如何在当前语言环境下使用 strerror_l?

标签 c linux posix libc strerror

我正在修复一些使用 strerror(非线程安全)进行多线程处理的 Linux 代码。我发现 strerror_rstrerror_l 都是线程安全的。由于 strerror_r 的不同定义(取决于 _GNU_SOURCE 它有不同的定义)我想使用较新的 strerror_l 函数,但是如何我应该获取当前语言环境的 locale_t 对象吗?我没有使用 iconv 或其他任何东西,只是普通的 libc,而且我不知道如何获得“默认语言环境”对象(我不关心用什么语言打印错误,我只想要一个人类可读的字符串。)

最佳答案

如果您将 ""传递给 locale 参数,newlocale 将分配一个 locale 对象集到当前本地语言环境 [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);
}

关于c - 如何在当前语言环境下使用 strerror_l?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858505/

相关文章:

c - 系统调用在 C++ 中没有提供足够的内存

linux - shell脚本监视具有相同IP的多个连接

没有 fork 可以用 pipe 吗?

linux - RabbitVCS GUI 不出现

python - 使用 python 或 linux 终端连接 wifi

c - 为什么 struct stat 中的 st_size 字段是有符号的?

c++ - 如何在 Intel-Edison [C++] 上打开 ttyMFD 设备?

c - 大量的文本数据应该如何存储在内存中?

c - 为什么这个 sizeof(c+a) 给出 4 个字节而不是 3 个字节

c - AVR ATmega48的中断编程