Андрей Робачевский - Операционная система UNIX
- Название:Операционная система UNIX
- Автор:
- Жанр:
- Издательство:BHV - Санкт-Петербург
- Год:1997
- Город:Санкт-Петербург
- ISBN:5-7791-0057-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Андрей Робачевский - Операционная система UNIX краткое содержание
Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей
Операционная система UNIX - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В системах UNIX BSD 4.x структура sigaction
имеет следующий вид:
struct sigaction {
void (*sa_handler)();
sigset_t sa_mask;
int sa_flags;
};
где функция-обработчик определена следующим образом:
void handler(int signo, int code, struct sigcontext *scp);
В первом аргументе signo
содержится номер сигнала, code
определяет дополнительную информацию о причине поступления сигнала, a scp
указывает на контекст процесса.
Для UNIX System V реализована следующая возможность получения более полной информации о сигнале. Если установлен флаг SA_SIGINFO
, то при получении сигнала sig
будет вызван обработчик, адресованный полем sa_sigaction
. Помимо номера сигнала, обычно передаваемого обработчику сигнала, ему будет переданы указатель на структуру siginfo_t
, содержащую информацию о причинах получения сигнала, а также указатель на структуру ucontext_t
, содержащую контекст процесса.
Структура siginfo_t
определена в файле и включает следующие поля:
int si_signo |
Номер сигнала |
int si_errno |
Номер ошибки |
int si_code |
Причина отправления сигнала |
В поле si_signo
хранится номер сигнала. Поле si_code
имеет следующий смысл: если его значение меньше или равно нулю, значит сигнал был отправлен прикладным процессом, в этом случае структура siginfo_t
содержит также следующие поля:
pid_t si_pid |
Идентификатор процесса PID |
uid_t si_uid |
Идентификатор пользователя UID |
которые адресуют процесс, пославший сигнал; если значение si_code
больше нуля, то оно указывает на причину отправления сигнала. Список возможных значений si_code
для некоторых сигналов, соответствующих полю si_signo
, приведен в табл. 2.19
Таблица 2.19. Значения поля si_code структуры siginfo_t для некоторых сигналов
Значение поля si_signo |
Значение поля si_code |
Описание |
---|---|---|
SIGILL |
Попытка выполнения недопустимой инструкции | |
ILL_ILLOPC |
Недопустимый код операции (opcode) | |
ILL_ILLOPN |
Недопустимый операнд | |
ILL_ADR |
Недопустимый режим адресации | |
ILL_ILLTRP |
Недопустимая ловушка (trap) | |
ILL_PRVOPC |
Привилегированный код операции | |
ILL_PRVREG |
Привилегированный регистр | |
ILL_COPROC |
Ошибка сопроцессора | |
ILL_BADSTK |
Ошибка внутреннего стека | |
SIGFPE |
Особая ситуация операции с плавающей точкой | |
FPE_INTDIV |
Целочисленное деление на ноль | |
FPE_INTOVF |
Целочисленное переполнение | |
FPE_FLTDIV |
Деление на ноль с плавающей точкой | |
FPE_FLTOVF |
Переполнение с плавающей точкой | |
FPE_FLTUND |
Потеря точности с плавающей точкой (underflow) | |
FPE_FLTRES |
Неоднозначный результат операции с плавающей точкой | |
FPE_FLTINV |
Недопустимая операция с плавающей точкой | |
FPE_FLTSUB |
Индекс вне диапазона | |
SIGSEGV |
Нарушение сегментации | |
SEGV_MAPPER |
Адрес не отображается на объект | |
SEGV_ACCERR |
Недостаточно прав на отображаемый объект | |
SIGBUS |
Ошибка адресации | |
BUS_ADRALN |
Недопустимое выравнивание адреса | |
BUS_ADRERR |
Несуществующий физический адрес | |
BUS_OBJERR |
Аппаратная ошибка, связанная с объектом | |
SIGTRAP |
Ловушка | |
TRAP_BRKPT |
Процессом достигнута точка останова | |
TRAP_TRACE |
Ловушка трассирования процесса | |
SIGCHLD |
Завершение выполнения дочернего процесса | |
CLD_EXITED |
Дочерний процесс завершил выполнение | |
CLD_KILLED |
Дочерний процесс был "убит" | |
CLD_DUMPED |
Ненормальное завершение дочернего процесса | |
CLD_TRAPPED |
Трассируемый дочерний процесс находится в ловушке | |
CLD_STOPPED |
Выполнение дочернего процесса было остановлено | |
CLD_CONTINUED |
Выполнение остановленного дочернего процесса было продолжено | |
SIGPOLL |
Событие на опрашиваемом устройстве | |
POLL_IN |
Поступили данные для ввода | |
POLL_OUT |
Свободны буферы данных | |
POLL_MSG |
Сообщение ожидает ввода | |
POLL_ERR |
Ошибка ввода/вывода | |
POLL_PRI |
Высокоприоритетные данные ожидают ввода | |
POLL_HUP |
Устройство отключено |
Уже отмечалось, что при получении сигнала от пользовательского процесса структура siginfo_t
содержит дополнительные поля (табл. 2.20).
Таблица 2.20. Дополнительные поля структуры siginfo_t
Значение поля si_signo |
Дополнительные поля | Значение |
---|---|---|
SIGILL SIGFPE | caddr_t si_addr |
Адрес недопустимой инструкции |
SIGSEGV SIGBUS | caddr_t si_addr |
Адрес недопустимой области памяти |
SIGCHLD | pid_t si_pid |
Идентификатор дочернего процесса |
int si_status |
Код возврата сигнала | |
SIGPOLL | long si_band |
Ошибка канала (для модулей STREAMS) |
Установить маску сигналов или получить текущую маску можно с помощью функции sigprocmask(2) :
#include
int sigprocmask(int how, sigset_t *set, sigset_t *oset);
Маска сигналов изменяется в соответствии с аргументом how
, который может принимать следующие значения:
SIG_BLOCK |
Результирующая маска получится путем объединения текущей маски и набора set |
SIG_UNBLOCK |
Сигналы набора set будут удалены из текущей маски |
SIG_SETMASK |
Текущая маска будет заменена на набор set |
Если указатель set
равен NULL
, то аргумент how игнорируется. Если аргумент oset
не равен NULL
, то в набор, адресованный этим аргументом, помещается текущая маска сигналов.
Функция sigpending(2) используется для получения набора заблокированных сигналов, ожидающих доставки:
#include
int sigpending(int how, sigset_t *set, sigset_t *oset);
Список сигналов, ожидающих доставки, возвращается в наборе, адресованном аргументом set
.
Системный вызов sigsuspend(2) замещает текущую маску набором, адресованным аргументом set
, и приостанавливает выполнение процесса до получения сигналов, диспозиция которых установлена либо на завершение выполнения процесса, либо на вызов функции-обработчика сигнала.
#include
int sigsuspend(const sigset_t *set);
При получении сигнала, завершающего выполнение процесса, возврата из функции sigsuspend(2) не происходит. Если же диспозиция полученного сигнала установлена на вызов функции-обработчика, возврат из sisuspend(2) происходит сразу после завершения обработки сигнала. При этом восстанавливается маска, существовавшая до вызова sigsuspend(2) .
Читать дальшеИнтервал:
Закладка: