2012-07-28 1 views
19

J'ai deux appels à deux méthodes différentes:Comment définir la valeur errno?

void func1() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to EEXIST 

    } 

} 

Et la deuxième méthode:

void func2() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to ENOENT 

    } 

} 
  1. Quand je mets le errno à une certaine valeur, que fait-il? juste une vérification d'erreur?

  2. Comment puis-je mettre errno dans les méthodes ci-dessus func1 et func2-EEXIST et ENOENT

Merci

Répondre

42

Pour toutes fins pratiques, vous pouvez traiter errno comme une variable globale (bien qu'il soit généralement ne pas). Donc inclure errno.h et simplement l'utiliser:

errno = ENOENT; 

Vous devez vous demander si errno est le meilleur mécanisme de rapport d'erreurs à vos besoins. Les fonctions peuvent-elles être conçues pour renvoyer le code d'erreur eux-mêmes?

+11

Conventionnellement, 'errno' est utilisé pour signaler les * erreurs système *. Pensez-vous que votre bibliothèque ou votre code fait partie du système? Sinon, utilisez un autre mécanisme pour signaler les erreurs. –

+3

Pas nécessairement, les fonctions utilitaires comme strtol() semblent aussi renvoyer ERANGE, par exemple, qui n'est pas vraiment un _system error_. – proteus

+1

Un exemple d'endroit où il peut être approprié de définir errno serait dans une fonction de lecture ou d'écriture callback passée à funopen(). Dans ce cas, on s'attend à ce que votre implémentation corresponde au contrat d'un appel système (read() ou write()), donc il serait logique de renvoyer -1 en cas d'erreur et de définir errno avec l'erreur spécifique. – orpheist

3
#include <errno.h> 
void func1() 
{ 
    // do something 
    if (fail) 
    { 
    errno = ENOENT; 
    } 
} 
5

IMO, le standard errno conçu pour le niveau système. Mon expérience est de ne pas les polluer. Si vous souhaitez simuler le mécanisme standard C errno, vous pouvez faire une définition comme:

/* your_errno.c */ 
__thread int g_your_error_code; 

/* your_errno.h */ 
extern __thread int g_your_error_code 
#define set_your_errno(err) (g_your_error_code = (err)) 
#define your_errno (g_your_error_code) 

et vous pouvez également mettre en œuvre encore your_perror(err_code). Plus d'informations, s'il vous plaît se référer à glibc mise en œuvre.