Когда следует использовать 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