2012-07-28 14 views
19

mam dwa połączenia z dwoma różnymi metodami:Jak ustawić wartość errno?

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

    } 

} 

A druga metoda:

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

    } 

} 
  1. Kiedy ustawić errno do pewnej wartości, co to robi? tylko sprawdzanie błędów?

  2. Jak mogę ustawić errno w powyższych metod func1 i func2 do EEXIST i ENOENT

Thanks

Odpowiedz

42

Dla wszystkich celów praktycznych, można traktować errno jak zmiennej globalnej (chociaż to zazwyczaj nie). Więc to errno.h i po prostu użyć go:

errno = ENOENT; 

Należy zadać sobie pytanie, czy errno jest najlepszy mechanizm raportowania błędów do swoich celów. Czy funkcje mogą zostać zaprojektowane tak, aby same zwracały kod błędu?

+11

Konwencja "errno" służy do zgłaszania * błędów systemowych *. Czy czujesz, że twoja biblioteka lub twój kod jest częścią systemu? Jeśli nie, użyj innego mechanizmu do zgłaszania błędów. –

+3

Niekoniecznie funkcje narzędziowe, takie jak strtol(), również wydają się zwracać ERANGE, na przykład, tak naprawdę nie jest to _system error_. – proteus

+1

Przykładem miejsca, w którym może być właściwe ustawienie zmiennej errno, byłoby wywołanie funkcji odczytu lub zapisu przekazane funopen(). W tym przypadku twoja implementacja ma się zgadzać z umową wywołania systemowego (read() lub write()), więc warto by było zwrócić -1 w przypadku błędu i ustawić errno z konkretnym błędem. – orpheist

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

IMO, standard errno Przeznaczony dla poziomu systemu. Moje doświadczenie nie zanieczyszcza ich. Jeśli chcesz, aby symulować C Standard errno mechanizm, można zrobić kilka definicji jak:

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

a także nadal można wdrożyć your_perror(err_code). Więcej informacji można znaleźć w implementacji glibc.

Powiązane problemy