2015-01-09 10 views
5

Sto correggendo del codice Linux che utilizzava strerror (non thread-safe) per il multi-threading. Ho trovato che strerror_r e strerror_l sono entrambi thread-safe. A causa delle diverse definizioni per strerror_r (a seconda di _GNU_SOURCE è diversamente definito) Vorrei utilizzare la più recente funzione strerror_l, ma come dovrei ottenere un oggetto locale_t per le impostazioni internazionali correnti? Non sto usando iconv o nulla, semplicemente libc, e non vedo come posso ottenere un oggetto "locale predefinito" (non mi interessa in quale lingua viene stampato l'errore, voglio solo una stringa leggibile dall'uomo .)Come usare strerror_l con le impostazioni locali correnti?

risposta

0

Se passate "" per il parametro locale newlocale assegnerà un oggetto locale impostato per il locale nativo corrente [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); 
    }