Макрос библиотеки C -errno

Стандартная библиотека C - <errno.h>

Описание

Макрос библиотеки Cextern int errnoустанавливается системными вызовами, а некоторые библиотечные функции при ошибках сообщают, какая ошибка произошла.

errno— это макрос в стандартной библиотеке C, определённый в<errno.h>В заголовочном файле. Он используется для указания ошибок, возникающих во время выполнения программы.errnoна самом деле является целочисленной переменной, используемой для хранения кодов ошибок. Когда библиотечные функции сталкиваются с ошибкой, они устанавливаютerrnoв соответствующий код ошибки, чтобы программа могла проверять и обрабатывать эти ошибки.

Объявление

Ниже приведено объявление макроса errno.

extern int errno

Параметр

  • Н/Д

Возвращаемое значение

  • Н/Д

ИспользованиеerrnoШаги

  1. Подключение заголовочных файлов: при использованииerrnoПеред этим необходимо включить<errno.h>Заголовочный файл.
  2. Вызов функции: вызов может установитьerrnoфункции.
  3. Проверяетerrno: когда функция возвращает значение, указывающее на ошибку, проверьтеerrnoчтобы получить тип ошибки.
  4. Обрабатывайте ошибки: Согласноerrnoзначение и примите соответствующие меры по обработке ошибок.

Пример

В следующем примере демонстрируется использование макроса errno.

Пример

#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE *fp; fp = fopen("file.txt", "r"); if( fp == NULL ) { fprintf(stderr, "Значение errno: %d\n", errno); fprintf(stderr, "Ошибка при открытии файла: %s\n", strerror(errno)); } else { fclose(fp); } return(0); }

Давайте скомпилируем и запустим вышеприведённую программу, когда файл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: Обрыв канала

Примечания

  1. Потокобезопасность: В многопоточной среде,errnoобычно реализуется как локальное хранилище потока (TLS), гарантируя, что каждый поток имеет независимуюerrnoзначение.
  2. Начальное значение: Когда вызов функции завершается успешно,errnoобычно не изменяется. Поэтому перед обработкой ошибок следует убедиться, чтоerrnoустанавливается в 0.
  3. Кроссплатформенные различия: Разные операционные системы и реализации стандартной библиотеки C могут определять дополнительные коды ошибок. Программы должны избегать зависимости от числовых значений конкретных кодов ошибок.

Рекомендации по обработке ошибок

  1. Проверяйте возвращаемое значение: При вызове функций, которые могут завершиться неудачно, всегда проверяйте их возвращаемое значение.
  2. Настройкиerrnoравен 0: Перед вызовом функции можноerrnoустановить в 0, чтобы после вызова функции можно было проверитьerrno, изменился ли он.
  3. Использованиеstrerrorиperror:strerrorФункция будетerrnoпреобразовать в читаемую строку сообщения об ошибке;perrorфункция выводит значение errno с описательным сообщением об ошибке.errnoзначение.

Подробная обработка ошибок

Ниже приведён более подробный пример, демонстрирующий, как обрабатывать различныеerrnoЗначение:

Пример

#include <stdio.h>
#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>обеспечивает стандартизированный способ сообщения об ошибках и их обработки в программах, делая код обработки ошибок более согласованным и поддерживаемым.

Стандартная библиотека C - <errno.h>

Другие расширения