2015-01-09 66 views
5

我正在修復一些使用strerror(非線程安全)的多線程的Linux代碼。我發現strerror_rstrerror_l都是線程安全的。由於strerror_r的不同定義(取決於_GNU_SOURCE它有不同的定義)我想使用新的strerror_l函數,但是我應該如何獲取當前語言環境的locale_t對象?我沒有使用iconv或任何東西,只是簡單的libc,我不明白我如何獲得「默認區域設置」對象(我不在乎打印錯誤的語言,我只想要一個人類可讀的字符串。)如何在當前語言環境中使用strerror_l?

回答

0

如果傳遞 「」 到區域設置參數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); 
    } 
相關問題