Kiedy należy używać perror("...") i fprintf (stderr, "...")?
Czytanie stron podręcznika i niektórych kodów nie pomogło mi w
zrozumienie różnicy między - lub lepiej, kiedy powinienem użyć - perror("...")
lub fprintf(stderr, "...")
.
5 answers
Wywołanie perror
da zinterpretowaną wartość errno
, która jest lokalną wartością błędu wątku zapisaną przez syscalls POSIX (tzn. każdy wątek ma swoją własną wartość dla errno
). Na przykład, jeśli wykonałeś połączenie do open()
i wystąpił błąd (np. zwrócił -1
), możesz wywołać perror
natychmiast po tym, aby zobaczyć, jaki był rzeczywisty błąd. Pamiętaj, że jeśli w międzyczasie wywołasz inne syscalle, wtedy wartość errno
zostanie zapisana i wywołanie perror
nie będzie przydatne w diagnozowaniu problemu, jeśli błąd został wygenerowany przez wcześniejszy syscall.
fprintf(stderr, ...)
z drugiej strony może być używany do drukowania własnych niestandardowych komunikatów o błędach. Drukując do stderr
, unikniesz mieszania raportów o błędach z "normalnym" wyjściem, które powinno być stdout
.
Należy pamiętać, że fprintf(stderr, "%s\n", strerror(errno))
jest podobna do perror(NULL)
, ponieważ wywołanie strerror(errno)
wygeneruje wydrukowaną wartość ciągu dla errno
, a następnie można ją połączyć z dowolnym innym niestandardowym komunikat o błędzie poprzez fprintf
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-22 20:11:29
Robią raczej różne rzeczy.
Używasz perror()
, aby wydrukować wiadomość do stderr
, która odpowiada errno
. Używasz {[5] } aby wydrukować cokolwiek do stderr
, lub dowolnego innego strumienia. perror()
jest bardzo wyspecjalizowaną funkcją drukowania:
perror(str);
Jest równoważne
if (str)
fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
fprintf(stderr, "%s\n", strerror(errno));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-24 06:53:09
perror(const char *s)
: wypisuje podany ciąg znaków, po którym następuje ciąg opisujący bieżącą wartość errno
.
stderr
: jest to strumień wyjściowy używany do przesyłania własnych komunikatów o błędach (domyślnie do terminala).
Istotne:
char *strerror(int errnum)
: podaj mu numer błędu, a zwróci powiązany ciąg błędów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-24 02:13:13
Perror () zawsze pisze do stderr; strerr (), używane razem z fprintf (), może zapisywać na dowolne wyjście - włączając w to stderr, ale nie wyłącznie.
fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
Ponadto perror narzuca własne formatowanie tekstu "text: error description"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-19 14:28:07
Funkcja Perror wymaga więcej czasu, aby wykonać wywołanie wykonawcze przechodzi z przestrzeni użytkownika do przestrzeni kernal, gdzie wywołania fprintf przechodzą do api do przestrzeni kernal
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-04 07:53:57