Чтение страниц руководства и некоторый код на самом деле не помогли мне
понимая разницу между - или лучше, когда я должен использовать - perror("...")
или fprintf(stderr, "...")
.
Когда следует использовать perror ( "..." ) и fprintf (stderr, "..." )?
Ответ 1
Вызов perror
даст вам интерпретируемое значение errno
, которое является значением локальной локальной ошибки, записанным с помощью системных вызовов POSIX (т.е. каждый поток имеет собственное значение для errno
). Например, если вы сделали вызов open()
, и произошла сгенерированная ошибка (т.е. Она вернула -1
), вы можете сразу вызвать perror
, чтобы узнать, что такое фактическая ошибка. Имейте в виду, что если вы вызовете другие системные вызовы за это время, то значение в errno
будет записано более, а вызов perror
не будет полезен при диагностике вашей проблемы, если ошибка была сгенерирована более ранним syscall.
fprintf(stderr, ...)
с другой стороны можно использовать для печати собственных сообщений об ошибках. При печати на stderr
вы избегаете вывода сообщений об ошибках, смешанных с "нормальным" выходом, который должен идти в stdout
.
Имейте в виду, что fprintf(stderr, "%s\n", strerror(errno))
похож на perror(NULL)
, так как вызов strerror(errno)
генерирует напечатанное строковое значение для errno
, и вы можете объединить его с любым другим пользовательским сообщением об ошибке через fprintf
.
Ответ 2
Они делают совсем другие вещи.
Вы используете perror()
для печати сообщения stderr
, которое соответствует errno
. Вы используете fprintf()
для печати всего stderr
или любого другого потока. perror()
- очень специализированная функция печати:
perror(str);
эквивалентно
if (str)
fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
fprintf(stderr, "%s\n", strerror(errno));
Ответ 3
perror(const char *s)
: печатает строку, которую вы передаете, а затем строку, которая описывает текущее значение errno
.
stderr
: это поток вывода, используемый для передачи ваших собственных сообщений об ошибках (по умолчанию используется терминал).
Соответствующие
char *strerror(int errnum)
: укажите номер ошибки и вернет связанную строку ошибки.
Ответ 4
perror() всегда записывает в stderr; strerr(), используемый вместе с fprintf(), может записывать на любой вывод - включая stderr, но не исключительно.
fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
Кроме того, perror накладывает свой собственный текст, формируя "текст: описание ошибки"
Ответ 5
Функция Perror занимает больше времени, чтобы выполнить вызов выполнения переходит из пользовательского пространства в пространство ядра, где fprintf вызывает go to api to kernal