Операционная система UNIX
Операционная система UNIX читать книгу онлайн
Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Функция принимает в качестве аргумента errnum номер ошибки и возвращает указатель на строку, содержащую сообщение о причине ошибочной ситуации.
Функция perror(3C) объявлена следующим образом:
#include <errno.h>
#include <stdio.h>
void perror(const char *s);
Функция выводит в стандартный поток сообщений об ошибках информацию об ошибочной ситуации, основываясь на значении переменной errno. Строка s, передаваемая функции, предваряет это сообщение и может служить дополнительной информацией, например содержа название функции или программы, в которой произошла ошибка.
Следующий пример иллюстрирует использование этих двух функций:
#include <errno.h>
#include <stdio.h>
main(int argc, char *argv[]) {
fprintf(stderr, "ENOMEM: %sn", strerror(ENOMEM));
errno = ENOEXEC;
perror(argv[0]);
}
Запустив программу, мы получим следующий результат на экране:
$ <b>a.out</b>
ENOMEM: Not enough space
a.out: Exec format error
Эти функции используются, в частности, командным интерпретатором и большинством стандартных утилит UNIX. Например:
$ <b>rm does_not_exist</b>
does_not_exist: No such file or directory
$ <b>pg do_not_read</b>
do_not_read: Permission denied
$
В табл. 2.1 приведены наиболее общие ошибки системных вызовов, включая сообщения, которые обычно выводят функции strerror(3C) и perror(3C), а также их краткое описание.
Таблица 2.1. Некоторые ошибки системных вызовов
Код ошибки и сообщение | Описание |
---|---|
E2BIG Arg list too long | Размер списка аргументов, переданных системному вызову exec(2), плюс размер экспортируемых переменных окружения превышает ARG_MAX байт |
EACCESS Permission denied | Попытка доступа к файлу с недостаточными правами для данного класса (определяемого эффективным UID и GID процесса и соответствующими идентификаторами файла) |
EAGAIN Resource temporarily unavailable | Превышен предел использования некоторого ресурса, например, переполнена таблица процессов или пользователь превысил ограничение по количеству процессов с одинаковым UID. Причиной также может являться недостаток памяти или превышение соответствующего ограничения (см. раздел "Ограничения" далее в этой главе) |
EALREADY Operation already in progress | Попытка операции с неблокируемым объектом, уже обслуживающим некоторую операцию |
EBADF Bad file number | Попытка операции с файловым дескриптором, не адресующим никакой файл; также попытка операции чтения или записи с файловым дескриптором, полученным при открытии файла на запись или чтение, соответственно |
EBADFD File descriptor in bad state | Файловый дескриптор не адресует открытый файл или попытка операции чтения с файловым дескриптором, полученным при открытии файла только на запись |
EBUSY Device busy | Попытка монтирования устройства (файловой системы), которое уже примонтировано; попытка размонтировать файловую систему, имеющую открытые файлы; попытка обращения к недоступным ресурсам (семафоры, блокираторы и т.п.) |
ECHILD No child processes | Вызов функции wait(2) процессом, не имеющим дочерних процессов или процессов, для которых уже был сделан вызов wait(2) |
EDQUOT Disk quota exceeded | Попытка записи в файл, создание каталога или файла при превышении квоты пользователя на дисковые блоки, попытка создания файла при превышении пользовательской квоты на число inode |
EEXIST File exists | Имя существующего файла использовано в недопустимом контексте, например, сделана попытка создания символической связи с именем уже существующего файла |
EFAULT Bad address | Аппаратная ошибка при попытке использования системой аргумента функции, например, в качестве указателя передан недопустимый адрес |
EFBIG File too large | Размер файла превысил установленное ограничение RLIMIT_FSIZE или максимально допустимый размер для данной файловой системы (см. раздел "Ограничения" далее в этой главе) |
EINPROGRESS Operation now in progress | Попытка длительной операции (например, установление сетевого соединения) для неблокируемого объекта |
EINTR Interrupted system call | Получение асинхронного сигнала, например, сигнала SIGINT или SIGQUIT, во время обработки системного вызова. Если выполнение процесса будет продолжено после обработки сигнала, прерванный системный вызов завершится с этой ошибкой |
EINVAL Invalid argument | Передача неверного аргумента системному вызову. Например, размонтирование устройства (файловой системы), которое не было примонтировано. Другой пример — передача номера несуществующего сигнала системному вызову kill(2) |
EIO I/O error | Ошибка ввода/вывода физического устройства |
EISDIR Is a directory | Попытка операции, недопустимой для каталога, например, запись в каталог с помощью вызова write(2) |
ELOOP Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS | При попытке трансляции имени файла было обнаружено недопустимо большое число символических связей, превышающее значение MAXSYMLINKS |
EMFILE Too many open files | Число открытых файлов для процесса превысило максимальное значение OPEN_MAX |
ENAMETOOLONG File name too long | Длина полного имени файла (включая путь) превысила максимальное значение PATH_MAX |
ENFILE File table overflow | Переполнение файловой таблицы |
ENODEV No such device | Попытка недопустимой операции для устройства. Например, попытка чтения устройства только для записи или операция для несуществующего устройства |
ENOENT No such file or directory | Файл с указанным именем не существует или отсутствует каталог, указанный в полном имени файла |
ENOEXEC Exec format error | Попытка запуска на выполнение файла, который имеет права на выполнение, но не является файлом допустимого исполняемого формата |
ENOMEM Not enough space | При попытке запуска программы (exec(2)) или размещения памяти (brk(2)) размер запрашиваемой памяти превысил максимально возможный в системе |
ENOMSG No message of desired type | Попытка получения сообщения определенного типа, которого не существует в очереди (см. раздел "Сообщения" в главе 3) |
ENOSPC No space left on device | Попытка записи в файл или создания нового каталога при отсутствии свободного места на устройстве (в файловой системе) |
ENOSR Out of stream resources | Отсутствие очередей или головных модулей при попытке открытия устройства STREAMS. Это состояние является временным. После освобождения соответствующих ресурсов другими процессами операция может пройти успешно |
ENOSTR Not a stream device | Попытка применения операции, определенной для устройств типа STREAMS (например системного вызова putmsg(2) или getmsg(2)), для устройства другого типа |
ENOTDIR Not a directory | В операции, предусматривающей в качестве аргумента имя каталога, было указано имя файла другого типа (например, в пути для полного имени файла) |
ENOTTY Inappropriate ioctl for device | Попытка системного вызова ioctl(2) для устройства, которое не является символьным |
EPERM Not owner | Попытка модификации файла, способом, разрешенным только владельцу и суперпользователю и запрещенным остальным пользователям. Попытка операции, разрешенной только суперпользователю |
EPIPE Broken pipe | Попытка записи в канал (pipe), для которого не существует процесса, принимающего данные. В этой ситуации процессу обычно отправляется соответствующий сигнал. Ошибка возвращается при игнорировании сигнала |
EROFS Read-only file system | Попытка модификации файла или каталога для устройства (файловой системы), примонтированного только на чтение |
ESRCH No such process | Процесс с указанным PID не существует в системе |