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, "...").

 83
Author: Jamal, 2012-08-24

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.

 91
Author: Jason,
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));
 34
Author: freeboy1015,
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.

 9
Author: Adib,
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"

 0
Author: Sebastien,
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

 -2
Author: vivek singh,
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