Dzwoniąc execl(...)
, dostaję errno=2
. Co to znaczy? Jak mogę poznać znaczenie tego errno
?
221
Możesz użyć, strerror()
aby uzyskać czytelny dla człowieka ciąg dla numeru błędu. Jest to ten sam ciąg drukowany przez, perror()
ale jest przydatny, jeśli formatujesz komunikat o błędzie dla czegoś innego niż standardowe wyjście błędu.
Na przykład:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux obsługuje również wariant jawnie bezpieczny dla wątków strerror_r()
.
strerror()
nie jest bezpieczny dla wątku, podczas gdystrerror_r()
jest bezpieczny dla wątku. Funkcje MT-Safe lub Thread-Safe można bezpiecznie wywoływać w obecności innych wątków. MT, w MT-Safe, oznacza Multi Thread. -p26, Biblioteka GNU Cchar * strerror(int errnum )
[Funkcja] Wstęp: | MT-Unsafe race: strerror | Kupa AS-Niebezpieczna i18n | AC-Unsafe mem | Patrz Rozdział 1.2.2.1 [Pojęcia dotyczące bezpieczeństwa POSIX], strona 2. -p58, Biblioteka GNU Cerrno
jest bezpieczny dla wątków. Spójrz:#define errno *__errno_location()
errno
, że GNU libcstrerror
zapisuje w wewnętrznym buforze globalnym . Nie zawsze to robi, ale w niektórych przypadkach tak jest. Zastąpisz ten bufor, gdy inny wątek będzie go czytał.errno
, niestrerror()
.Zamiast uruchamiać się
perror
na dowolnym otrzymanym kodzie błędu, możesz pobrać pełną listęerrno
wartości w swoim systemie za pomocą następującej linijki:cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
źródło
W systemie Linux jest także bardzo miłe narzędzie, które od razu może powiedzieć, co oznacza każdy kod błędu. Na Ubuntu:
apt-get install errno
.Jeśli na przykład chcesz uzyskać opis typu błędu 2, po prostu wpisz
errno 2
terminal.Otrzymasz
errno -l
listę ze wszystkimi błędami i ich opisami. Znacznie łatwiej niż inne metody wspomniane przez poprzednie plakaty.źródło
perror
/strerror
jest lepsze, ponieważ wtedy UŻYTKOWNIK nie musi tego sprawdzać. Chociażerrno -l
lepiej je znaleźć.Oto wynik
errno -l
przeformatowania pod kątem czytelności:Użyłem tabularise w Vimie, aby wyrównać kolumny:
źródło
Kod błędu 2 oznacza „Nie znaleziono pliku / katalogu”. Zasadniczo można użyć funkcji perror do wydrukowania ciągu czytelnego dla człowieka.
źródło
Istnieje kilka przydatnych funkcji do radzenia sobie z
errno
s. (Żeby było jasne, są one wbudowane wlibc
- ja tylko dostarczam przykładowe implementacje, ponieważ niektórzy ludzie uważają czytanie kodu za wyraźniejsze niż czytanie angielskiego.)strerror
zwraca ciąg opisujący przekazany mu numer błędu. Uwaga, nie jest to bezpieczne dla wątków lub przerwań; można przepisać ciąg znaków i zwrócić ten sam wskaźnik przy następnym wywołaniu. Użyj,strerror_r
jeśli chcesz się tym martwić.perror
wypisuje podany komunikat, a także ciąg opisujący bieżącyerrno
błąd standardowy.źródło
some people find reading code clearer than reading English
prawda.Jest to szybsze niż wyszukiwanie kodu
errno.h
, krótsze niż większość opublikowanych tutaj rozwiązań i nie wymaga instalacji narzędzi innych firm:perl -E 'say $!=shift' 2
daje
No such file or directory
źródło
-E
traktuje poniższy cytowany kod jako skrypt Perla.say
pisze swoje argumenty na standardowym wyjściu.$!
jest specjalną zmienną o wartościerrno
. Jeśli zostanie użyty w kontekście ciągu, otrzyma odpowiedni ciąg błędu. Skrypt przypisuje wartość2
do tej zmiennej za pomocąshift
polecenia, które odcina nagłówek tablicy argumentów@ARGV
i umieszcza go na swoim miejscu. Wiersz polecenia mógł również zostać zapisany jakoperl -E 'say $!=2'
.Działa w systemie Solaris.
cc perror.c -o perror
<< użyj tej linii, aby ją skompilowaćźródło
perror(NULL);
? Zeperror("");
jest to format: ERROR NAME
. Zperror(NULL);
To wyjście jest tylkoERROR NAME
Oto dokumentacja . To powinno ci powiedzieć, co to znaczy i co z nimi zrobić. Należy unikać używania wartości liczbowej i używać również stałych tam wymienionych, ponieważ liczba może się zmieniać między różnymi systemami.
źródło
errnoname
biblioteka . Zajmuje się żmudną częścią gromadzenia wszystkich możliwych nazw errno do funkcji C, którą można w prosty sposób wykorzystać do uzyskania nazwy makra errno z numeru. Wykorzystanie tego jako podstawy, czyniąc twójperror
wariant powinien być szybki i łatwy.Używam następującego skryptu:
źródło
Wpisz,
sudo apt-get install moreutils
a następnie po zainstalowaniu wpiszerrno 2
. Można również używaćerrno -l
do wszystkich numerów błędów lub zobaczyć tylko te pliki przez rurociągi gogrep
w następujący sposób:errno | grep file
.źródło
Połączenie
w przypadku błędu.
Próba:
Do strony podręcznika z
errno(3)
iperror(3)
są interesujące, zbyt ...źródło
Kiedy używasz strace (w Linuksie) do uruchamiania twojego pliku binarnego, wyświetli on zwroty z wywołań systemowych i co oznacza numer błędu. Czasami może ci się to przydać.
źródło
Mam następujące funkcję w moim pliku .bashrc - wygląda się wartość errno z plików nagłówkowych (może być też
/usr/include/errno.h
,/usr/include/linux/errno.h
itd, itd.)Działa, jeśli pliki nagłówkowe są zainstalowane na komputerze ;-)
Zwykle plik nagłówkowy ma błąd + następnie pojawia się wyjaśnienie w komentarzu; coś z poniższych:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Spróbuj ponownie * /
źródło
To znaczy:
źródło