2012-07-28 13 views
19

tengo dos llamadas a dos métodos diferentes:¿Cómo establecer el valor de errno?

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

    } 

} 

y el segundo método:

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

    } 

} 
  1. Cuando me puse la errno a algún valor, lo que hace? solo la comprobación de errores?

  2. ¿Cómo puedo establecer errno en los métodos func1 anteriores y func2-EEXIST y ENOENT

Gracias

Respuesta

42

Para todos los efectos prácticos, se puede tratar errno como una variable global (aunque por lo general no). Por lo que incluyen errno.h y sólo lo utilizan:

errno = ENOENT; 

usted debe preguntarse si errno es el mejor mecanismo de notificación de errores para sus propósitos. ¿Pueden las funciones ser diseñadas para que ellos mismos devuelvan el código de error?

+11

Convencionalmente, 'errno' se usa para informar * errores del sistema *. ¿Siente que su biblioteca o su código es parte del sistema? De lo contrario, use otro mecanismo para informar errores. –

+3

No necesariamente, las funciones de utilidad como strtol() también parecen devolver ERANGE, por ejemplo, que no es realmente un _system error_. – proteus

+1

Un ejemplo de lugar en el que puede ser apropiado establecer errno sería en una devolución de llamada de función de lectura o escritura pasada a funopen(). En este caso, se espera que su implementación coincida con el contrato de una llamada al sistema (leer() o escribir()) por lo que tendría sentido devolver -1 en caso de error y establecer errno con el error específico. – orpheist

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

IMO, el estándar errno diseñado para el nivel del sistema. Mi experiencia es no contaminarlos. Si desea simular el estándar errno mecanismo de C, que puede hacer alguna definición como:

/* 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) 

y también podrá seguir realizando your_perror(err_code). Para obtener más información, consulte la implementación de glibc.

Cuestiones relacionadas