А. Робачевский - Операционная система UNIX (1114671), страница 20
Текст из файла (страница 20)
Таким образом, значениеerrno имеет смысл только после системного вызова, который завершился сошибкой.Стандарт ANSI С определяет две функции, помогающие сообщить причи!ну ошибочной ситуации:иФункцияимеет вид:ttinclude <string.h>charФункция принимает в качестве аргумента errnum номер ошибки и возвра!щает указатель на строку, содержащую сообщение о причине ошибочнойситуации.Функцияобъявлена следующим образом:<errno.h>voidcharФункция выводит в стандартный поток сообщений об ошибках информа!цию об ошибочной ситуации, основываясь на значении переменной errno.Строка s, передаваемая функции, предваряет это сообщение и может слу!жить дополнительной информацией, например содержа название функцииили программы, в которой произошла ошибка.Следующий пример иллюстрирует использование этих двух функций:<errno.h><stdio.h>argc, char{errno =perror (argv [)}Запустив программу, мы получим следующий результат на экране:$ENOMEM: Not enough spaceExec format errorЭти функции используются, в частности, командным интерпретатором ибольшинством стандартных утилит UNIX.
Например:$No such f i l e or directoryошибка ENOENT$ pgdo_not_read:Permission deniedошибка EACCESS$www.books-shop.com97Программный интерфейс UNIXВ табл. 2.1 приведены наиболее общие ошибки системных вызовов, вклю!чая сообщения, которые обычно выводят функциииа также их краткое описание.Таблица 2.1. Некоторые ошибки системных вызововКод ошибки и сообщениеОписаниеE2BIGArg list too longРазмер списка аргументов, переданных систем%ному вызовуплюс размер экспортируе%мых переменных окружения превышает ARG_MAXбайтEACCESSPermission deniedПопытка доступа к файлу с недостаточными пра%вами для данного класса (определяемого эффек%тивными GID процесса и соответствующимиидентификаторами файла)EAGAINПревышен предел использования некоторого ре%сурса, например, переполнена таблица процессовили пользователь превысил ограничение по коли%честву процессов с одинаковым UID.
Причинойтакже может являться недостаток памяти илипревышение соответствующего ограничения (см.раздел "Ограничения" далее в этой главе)Resource temporarily unavailableEALREADYOperation already in progressПопытка операции с неблокируемым объектом,уже обслуживающим некоторую операциюEBADFBad file numberПопытка операции с файловым дескриптором, неадресующим никакой файл; также попытка опе%рации чтения или записи с файловым дескрипто%ром, полученным при открытии файла на записьили чтение, соответственноEBADFDФайловый дескриптор не адресует открытыйфайл или попытка операции чтения с файловымдескриптором, полученным при открытии файлатолько на записьFile descriptor in bad stateEBUSYDevice busyПопытка монтирования устройства (файловойсистемы), которое уже примонтировано; попыткаразмонтировать файловую систему, имеющуюоткрытые файлы; попытка обращения к недоступ%ным ресурсам (семафоры, блокираторы и т.
п.)ECHILDNo child processesВызов функциипроцессом, не имеющимдочерних процессов или процессов, для которыхуже был сделан вызовEDQUOTПопытка записи в файл, создание каталога илифайла при превышении квоты пользователя надисковые блоки, попытка создания файла припревышении пользовательской квоты на числоinodeDisk quota exceededwww.books-shop.comГлава 2.98программирования UNIXТаблица 2.1 (продолжение)Код ошибки иОписаниеEEXISTFile existsИмя существующего файла использовано в недо%пустимом контексте, например, сделана попыткасоздания символической связи с именем ужесуществующего файлаEFAULTBad addressАппаратная ошибка при попытке использованиясистемой аргумента функции, например, в каче%стве указателя передан недопустимый адресEFBIGFile too largeРазмер файла превысил установленное ограни%чение RLIMIT_FSIZE или максимально допусти%мый размер для данной файловой системы (см.раздел "Ограничения" далее в этой главе)EINPROGRESSOperation now in progressПопытка длительной операции (например, уста%новление сетевого соединения) для неблокируе%мого объектаEINTRInterrupted system callПолучение асинхронного сигнала, например, сиг%нала SIGINT иливо время обработки сис%темного вызова.
Если выполнение процесса будетпродолжено после обработки сигнала, прерванныйсистемный вызов завершится с этой ошибкойEINVALInvalid argumentПередача неверного аргумента системному вызо%ву. Например, размонтирование устройства (фай%ловой системы), которое не было примонтирова%но. Другой пример — передача номера несущест%вующего сигнала системному вызову kill(2)ЕЮI/O errorОшибкаEISDIRIs a directoryПопытка операции, недопустимой для каталога,например, запись в каталог с помощью вызоваELOOPNumber of symbolic links encoun%tered during path name traversalexceedsEMFILEToo many open filesПри попытке трансляции имени файла было обна%ружено недопустимо большое число символическихсвязей, превышающее значение MAXSYMLINKSЧисло открытых файлов для процесса превысиломаксимальное значение OPEN MAXFile name too longДлина полного имени файла (включая путь) пре%высила максимальное значение PATH MAXфизического устройстваПереполнение файловой таблицыFile table overflowENODEVNo such deviceПопытка недопустимой операции для устройства.
На%пример, попытка чтения устройства только для записиили операция для несуществующего устройстваwww.books-shop.com99Программный интерфейс UNIXТаблица 2.1 (продолжение)Код ошибки и сообщениеОписаниеENOENTNo such file or directoryФайл с указанным именем не существует илиотсутствует каталог, указанный в полном именифайлаENOEXECExec format errorПопытка запуска на выполнение файла, которыйимеет права на выполнение, но не является фай%лом допустимого исполняемого форматаENOMEMNot enough spaceПри попытке запуска программыилиразмещения памятиразмер запрашивае%мой памяти превысил максимально возможный всистемеNo message of desired typeПопытка получения сообщения определенноготипа, которого не существует в очереди (см.
раз%дел "Сообщения" в главе 3)ENOSPCNo space left on deviceПопытка записи в файл или создания нового ка%талога при отсутствии свободного места на уст%ройстве (в файловой системе)ENOSROut of stream resourcesОтсутствие очередей или головных модулей припопытке открытия устройства STREAMS. Это со%стояние является временным. После освобожде%ния соответствующих ресурсов другими процес%сами операция может пройти успешноENOSTRNot a stream deviceПопытка применения операции, определеннойдля устройств типа STREAMS (например систем%ного вызова putmsg(2) илидля устрой%ства другого типаENOTDIRNot a directoryВ операции, предусматривающей в качестве ар%гумента имя каталога, было указано имя файладругого типа (например, в пути для полного именифайла)ENOTTYInappropriatefor deviceПопытка системного вызова ioctl(2) для устройст%ва, которое не является символьнымEPERMNot ownerПопытка модификации файла, способом, разре%шенным только владельцу и суперпользователю изапрещенным остальным пользователям.
Попыт%ка операции, разрешенной только суперпользо%вателюEPIPEBroken pipeПопытка записи в канал (pipe), для которого несуществует процесса, принимающего данные. Вэтой ситуации процессу обычно отправляется со%ответствующий сигнал. Ошибка возвращается присигналаȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.comГлава 2. Среда программирования UNIXТаблица 2.1 (окончание)Код ошибки и сообщениеEROFSRead%only file systemESRCHNo such processОписаниеПопытка модификации файла или каталога дляустройства (файловой системы), примонтирован%ного только на чтениеПроцесс с указанным PID не существует в системеСоздание программыСоздание любой программы обычно начинается с базовой идеи (но не все!гда), разработки ее блок!схемы (современные программисты часто пропус!кают этот этап), интерфейса пользователя (весьма ответственный процесс) инаписания исходного текста.
Далее следуют этапы компиляции и отладки.В этом разделе рассмотрен процесс созданиянаписанного наязыке С и разработанного для операционной системы UNIX. Предвидяобвинения в архаизме, мы все!таки остановимся на добротном ANSI С ибазовой среде разработки UNIX, во!первых, полагая, что старый друглучше новых двух, а во!вторых потому, что объектом нашего обсуждениявсе же является UNIX, а не современные средства создания приложений.Заметим также, что язык программирования С является "родным" языкомUNIX, поскольку ядро операционной системы написано на этомЭто, безусловно, не ограничивает возможности других языков и техноло!гий программирования, которые сегодня, наверное, используются дажечаще, чем обсуждаемый нами традиционный подход.Опустим также процесс рождения базовой идеи и разработку блок!схем,полагая, что все это уже сделано. Итак, начнем с исходного текста буду!щей программы.Исходный текстИсходные тексты программы, разработанной для UNIX, по большому сче!ту мало отличаются от текстов приложений, создаваемых для других опе!рационных систем.