Главная » Программирование для UNIX » Обработка ошибок – errno

0

Системные вызовы, описанные в этом  разделе, а фактически все системные вызовы, могут завершаться с ошибками. Обычно они сообщают об этом,  возвращая значение –1. Иногда бывает полезно знать, какая именно ошибка произошла; с этой целью все системные вызовы, когда это уместно, оставляют номер  ошибки во  внешней переменной errno. (Значения различных номеров ошибок приведены во введении раздела  2 руководства по UNIX  для  программиста.) Пользуясь errno, программа может, к примеру, определить, вызвана ошибка открытия фай ла его отсутствием или же отсутствием прав доступа к нему у пользователя. Для  преобразования номеров в текстовые сообщения существует массив строк sys_errlist, индексом в котором служат значения errno.1

Наша версия функции error использует эти структуры данных:

error(s1, s2)  /*  вывести сообщение  об  ошибке  и закончить работу */ char  *s1,  *s2;

{

extern int errno, sys_nerr;

extern char  *sys_errlist[],  *progname;

if (progname)

fprintf(stderr,  "%s:  ",  progname); fprintf(stderr,  s1,  s2);

if (errno  > 0 &&   errno < sys_nerr)

fprintf(stderr,  "  (%s)",  sys_errlist[errno]); fprintf(stderr, "\n");

exit(1);

}

Значение  errno   инициализируется  нулем  и  не  должно  превышать sys_nerr. При  отсутствии ошибок errno  не обнуляется, следовательно, пользователь должен делать это самостоятельно, если  программа продолжает работу  после возникновения ошибки.

1        В современных реализациях  переменная  sys_errlist объявлена в  stdio.h как константный указатель, поэтому следует исключить предложенное ниже объявление sys_errlist, так как его присутствие в тексте программы будет вызывать ошибку компиляции из-за несоответствия типов в объявлениях sys_errlist, полученных из stdio.h и из текста программы. – Примеч. науч. ред.

Вот как выглядят сообщения об ошибках в данной версии cp:

$ cp foo  bar

cp:  can’t open foo  (No such  file  or  directory)

$ date >foo;  chmod 0 foo               Создан файл с запретом на чтение

$ cp foo  bar

cp:  can’t open foo  (Permission denied)

$

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии