Обработка ошибок

Обработке ошибок уделяется большое значение в UNIX, так как написание надежных и устойчивых программ, особенно для многопользовательских систем, является весьма важным.

Обычно в случае возникновения ошибки системные вызовы возвращают -1 и устанавливают значение переменной errno, указывающее возникновение ошибки. Библиотечные функции, как правило, значение errno не устанавливают, а код возврата различен для различных функций. Переменная errno не обнуляется следующим нормально завершившимся системным вызовом, следовательно эту переменную следует анализировать сразу же после системного вызова, который завершился с ошибкой.

Имеются также две функции, помогающие сообщить причину ошибочной ситуации.

external int errno;

#include <string.h>

char *strerror (int enum);

#include <errno.h>

#include <stdio.h>

void perror (char *s);

main (int argc, char *argv[ ])

{

fprintf(stderr, “ENOMEM:%s\n”, strerror (ENOMEM));

errno = ENOEXEC;

perror (argv[0]);

}

Функция strerror принимает в качестве аргумента номер ошибки и возвращает указатель на строку, содержащую сообщение о причине ошибочной ситуации.

Функция perror выводит в стандартный поток сообщений об ошибках информацию об ошибочной ситуации, основываясь на значении переменной errno. Строка s, передаваемая функции в качестве аргумента, предваряет сообщение об ошибке и может содержать дополнительную информацию, например название функции, в которой произошла ошибка.

Имеется условное обозначение большого числа ошибочных ситуаций, при которых они могут обнаруживаться и обрабатываться. Некоторые из них приведены ниже.

Ошибочная ситуация Примечание
  E2BIG Размер списка аргументов, переданных системному вызову exec плюс размер экспортируемых переменных окружения превышает максимально допустимое число байт (ARG_MAX).
  EACCESS Попытка доступа к файлу с недостаточными правами доступа для данного класса.
  EAGAIN Превышен предел использования некоторого ресурса, например переполнена таблица процессов.
  EBADF Попытка операции с файловым дескриптором, не адресующим никакой файл или попытка работы с файлом на недопустимую операцию (например, файл открыт на чтение, а попытка записи).
  EBADFD Файловый дескриптор не адресует открытый файл или попытка выполнения операции чтения с файловым дескриптором, полученным при открытии только на запись.
  EBUSY Попытка монтирования устройства (файловой системы), которое уже примонтировано; попытка размонтировать файловую систему, имеющую открытые файлы; попытка обращения к недоступным ресурсам.
  ECHILD Вызов функции wait процессом, не имеющим дочерних процессов или повторный вызов wait для процесса, для которого этот вызов уже был сделан.
  EDQUOT Зарезервирован
  EEXIST Имя существующего файла использовано в недопустимом контексте, например, попытка создания символической связи с именем уже существующего файла.
  EFAULT Аппаратная ошибка при попытке использования системой аргумента функции, например, в качестве указателя передан недопустимый адрес.
  EFBIG Размер файла превысил установленное ограничение RLIMIT_FSIZE или максимально допустимый размер для данной файловой системы.
  EINTR Получение асинхронного сигнала (SIGINT или SIGQUIT) во время обработки системного вызова.Если выполнение процесса будет продолжено после обработки сигнала, прерванный системный вызов завершится с этой ошибкой.
  EINVAL Передача неверного аргумента системному вызову.
  EIO Ошибка ввода-вывода физического устройства.
  EISDIR Попытка операции, недопустимой для каталогов.
  EMFILE Число открытых файлов для процесса превысило максимально допустимое значение.
  ENAMETOOLONG Длина имени файла, включая путь, превысило максимально допустимое значение.
  ENFILE Переполнение файловой таблицы.
  ENODEV Попытка недопустимой операции для устройства.
  ENOENT Файл с указанным именем не существует или отсутствует каталог, указанным в полном имени файла.
  ENOEXEC Попытка запуска на выполнение файла, который имеет права на выполнение, но не является файлом допустимого исполняемого формата
  ENOMEM Размер запрашиваемой памяти при запуске программы превысил максимально возможный в системе.
  ENOTDIR При задании имени каталога в операции, предусматривающей в качестве аргумента имя каталога, было указано имя файла другого типа.
  EPIPE Попытка записи в канал, для которого не существует процесса, принимающего данные. В этой ситуации процессу обычно направляется сигнал, ошибка возвращается при игнорировании сигнала.
  ESRCH Процесс с указанным PID не существует.

Программистам также предоставляется большой набор функций общего назначения, которые не являются точками входа в операционную систему, хотя в процессе выполнения многие из них выполняют системные вызовы (например, функция printf записывает данные в файл, используя системный вызов read). Библиотечные функции, хранящиеся в стандартных библиотеках вместе с системными вызовами, составляют основу среды программирования UNIX.

При разработке программ важное значение имеют файлы заголовков, где описаны значения большого количества констант и т.д.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: