Есть несколько полезных функций для работы с errno
с. (Просто чтобы прояснить это, они встроены в libc
- я просто предоставляю примеры реализаций, потому что некоторые люди находят чтение кода более понятным, чем чтение английского.)
#include <string.h>
char *strerror(int errnum);
/* you can think of it as being implemented like this: */
static char strerror_buf[1024];
const char *sys_errlist[] = {
[EPERM] = "Operation not permitted",
[ENOENT] = "No such file or directory",
[ESRCH] = "No such process",
[EINTR] = "Interrupted system call",
[EIO] = "I/O error",
[ENXIO] = "No such device or address",
[E2BIG] = "Argument list too long",
/* etc. */
};
int sys_nerr = sizeof(sys_errlist) / sizeof(char *);
char *strerror(int errnum) {
if (0 <= errnum && errnum < sys_nerr && sys_errlist[errnum])
strcpy(strerror_buf, sys_errlist[errnum]);
else
sprintf(strerror_buf, "Unknown error %d", errnum);
return strerror_buf;
}
strerror
возвращает строку, описывающую номер ошибки, который вы ей передали. Внимание, это не потокобезопасно и не защищено от прерываний; он может переписать строку и вернуть тот же указатель при следующем вызове. Используйте strerror_r
, если вам нужно об этом беспокоиться.
#include <stdio.h>
void perror(const char *s);
/* you can think of it as being implemented like this: */
void perror(const char *s) {
fprintf(stderr, "%s: %s\n", s, strerror(errno));
}
perror
выводит сообщение, которое вы ему даете, плюс строку, описывающую текущий errno
, со стандартной ошибкой.