Макрос библиотеки C -errno
Стандартная библиотека C - <errno.h>
Описание
Макрос библиотеки Cextern int errnoустанавливается системными вызовами, а некоторые библиотечные функции при ошибках сообщают, какая ошибка произошла.
errno— это макрос в стандартной библиотеке C, определённый в<errno.h>В заголовочном файле. Он используется для указания ошибок, возникающих во время выполнения программы.errnoна самом деле является целочисленной переменной, используемой для хранения кодов ошибок. Когда библиотечные функции сталкиваются с ошибкой, они устанавливаютerrnoв соответствующий код ошибки, чтобы программа могла проверять и обрабатывать эти ошибки.
Объявление
Ниже приведено объявление макроса errno.
extern int errno
Параметр
- Н/Д
Возвращаемое значение
- Н/Д
ИспользованиеerrnoШаги
- Подключение заголовочных файлов: при использовании
errnoПеред этим необходимо включить<errno.h>Заголовочный файл. - Вызов функции: вызов может установить
errnoфункции. - Проверяет
errno: когда функция возвращает значение, указывающее на ошибку, проверьтеerrnoчтобы получить тип ошибки. - Обрабатывайте ошибки: Согласно
errnoзначение и примите соответствующие меры по обработке ошибок.
Пример
В следующем примере демонстрируется использование макроса errno.
Пример
Давайте скомпилируем и запустим вышеприведённую программу, когда файлfile.txtКогда он не существует, произойдут следующие результаты:
Value of errno: 2 Error opening file: No such file or directory
РаспространённыеerrnoЗначение
EPERM: Операция не разрешенаENOENT: Нет такого файла или каталогаESRCH: Нет такого процессаEINTR: Прерванный системный вызовEIO: Ошибка ввода/выводаENXIO: Нет такого устройства или адресаE2BIG: Слишком длинный список аргументовENOMEM: Недостаточно памятиEACCES: Доступ запрещёнEFAULT: Неверный адресEBUSY: Ресурс занятEEXIST: Файл существуетEXDEV: Ссылка между устройствамиENODEV: Нет такого устройстваENOTDIR: Не является каталогомEISDIR: Является каталогомEINVAL: Недопустимый аргументENFILE: Переполнение системной таблицы файловEMFILE: Слишком много открытых файловENOTTY: Не является терминальным устройствомETXTBSY: Текстовый файл занятEFBIG: Файл слишком большойENOSPC: На устройстве не осталось местаESPIPE: Недопустимая адресацияEROFS: Файловая система только для чтенияEMLINK: Слишком много ссылокEPIPE: Обрыв канала
Примечания
- Потокобезопасность: В многопоточной среде,
errnoобычно реализуется как локальное хранилище потока (TLS), гарантируя, что каждый поток имеет независимуюerrnoзначение. - Начальное значение: Когда вызов функции завершается успешно,
errnoобычно не изменяется. Поэтому перед обработкой ошибок следует убедиться, чтоerrnoустанавливается в 0. - Кроссплатформенные различия: Разные операционные системы и реализации стандартной библиотеки C могут определять дополнительные коды ошибок. Программы должны избегать зависимости от числовых значений конкретных кодов ошибок.
Рекомендации по обработке ошибок
- Проверяйте возвращаемое значение: При вызове функций, которые могут завершиться неудачно, всегда проверяйте их возвращаемое значение.
- Настройки
errnoравен 0: Перед вызовом функции можноerrnoустановить в 0, чтобы после вызова функции можно было проверитьerrno, изменился ли он. - Использование
strerrorиperror:strerrorФункция будетerrnoпреобразовать в читаемую строку сообщения об ошибке;perrorфункция выводит значение errno с описательным сообщением об ошибке.errnoзначение.
Подробная обработка ошибок
Ниже приведён более подробный пример, демонстрирующий, как обрабатывать различныеerrnoЗначение:
Пример
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
switch (errno) {
case EACCES:
printf("Ошибка: доступ запрещён\n");
break;
case ENOENT:
printf("Ошибка: нет такого файла или каталога\n");
break;
default:
printf("Ошибка открытия файла: %s\n", strerror(errno));
}
return 1;
}
// Код обработки файлов
fclose(file);
return 0;
}
В этом примере мы проверили конкретноеerrnoзначение и обработали соответствующим образом. ЕслиerrnoДаEACCES(Отказано в доступе) илиENOENT(Нет такого файла или каталога), мы выводим конкретное сообщение об ошибке; в противном случае мы выводим общее сообщение об ошибке.
<errno.h>обеспечивает стандартизированный способ сообщения об ошибках и их обработки в программах, делая код обработки ошибок более согласованным и поддерживаемым.