Чтение страниц руководства и некоторый код на самом деле не помогли мне
понимая разницу между - или лучше, когда я должен использовать - 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