7 Лабораторная работа №7 интерфейс прикладного программирования ос unix: сигналы и управление процессами
7.1 Цель работы
Изучение программного интерфейса сигналов, а также механизмов посылки, получения и обработки сигналов процессами.
7.2 Теоретические сведения
Сигналы в ОС UNIX являются средством оповещения процесса о внешних или внутренних по отношению к процессу событиях. Собственно посылка сигнала осуществляется ядром ОС путем установки соответствующего сигналу бита в специальной переменной контекста процесса. Процесс обрабатывает полученные сигналы при переходе из режима ядра в режим задачи. Сигналы различают по номерам, обычно их в системе не более 32. Список использующихся в системе сигналов обычно можно посмотреть в системе помощи "man" или "info". Например, сигналы ОС Linux описаны в 7-ой секции "man". Сигналы некоторых типов могут быть сгенерированы ядром ОС при возникновении соответствующих событий, кроме того, процесс может с помощью ядра послать сигнал другому процессу или группе процессов (если имеет на это право). Реакция процесса на получение конкретного сигнала задается с помощью системных вызовов signal() и sigaction(). Посылка или проверка полномочий на посылку сигнала осуществляется системным вызовом kill() (или raise() - самому себе). Во многих системах процесс может блокировать получение сигналов (кроме SIGKILL и SIGSTOP) с помощью, так называемой сигнальной маски, которая устанавливается и опрашивается вызовом sigprocmask().
Пользовательский обработчик сигнала должен представлять собой функцию, получающую в качестве параметра номер пришедшего сигнала и указатель на структуру с дополнительной информацией (только если обработчик был установлен с помощью sigaction()). При получении сигнала ядро ОС может восстановить для процесса реакцию по-умолчанию на этот сигнал, кроме того, выполнение функции-обработчика может быть "прервано" таким же или другим сигналом. Такое поведение системы зависит от реализации и обычно может быть задано параметрами sigaction().
При получении большинства сигналов стандартной реакцией процесса является завершение работы, а при получении некоторых - еще и создание файла 'core' в текущем каталоге. Файл 'core' представляет собой образ процесса на момент получения сигнала и может быть передан в качестве параметра отладчику для выяснения причин возникновения сигнала. Поведение программы при перехвате таких сигналов зависит от реализации системы.
Перечень основных сигналов приведен в таблице 7.1.
Таблица 7.1 – Описание сигналов
Имя |
Номер |
Реакция |
Описание (причина) |
SIGHUP |
1 |
безусловное завершение |
обрыв линии управляющего терминала или завершение управляющего процесса |
SIGINT |
2 |
безусловное завершение |
клавиатурное прерывание (Ctrl+C) |
SIGQUIT |
3 |
безусловное завершение core dump |
клавиатурное завершение (Ctrl+\) |
SIGILL |
4 |
безусловное завершение core dump |
недопустимая машинная команда |
SIGKILL |
9 |
безусловное завершение |
сигнал безусловного завершения, его нельзя заблокировать, игнорировать или переопределить |
SIGSEGV |
11 |
безусловное завершение core dump |
нарушение границ сегмента памяти |
SIGPIPE |
13 |
безусловное завершение |
запись в канал, из которого никто не читает (+чтение) |
SIGBUS |
7 |
безусловное завершение core dump |
на шине адреса программа выставила неправильный адрес (напр. чтение слова с нечетного адреса) |
SIGALRM |
14 |
безусловное завершение |
сигнал от таймера, установленного вызовом alarm() или sleep() |
SIGTERM |
15 |
безусловное завершение |
сигнал завершения |
SIGUSR1 |
10 |
безусловное завершение |
пользовательский сигнал №1 |
SIGUSR2 |
12 |
безусловное завершение |
пользовательский сигнал №2 |
SIGCHLD |
17 |
игнорирование |
завершение или остановка потомка |
SIGCONT |
18 |
запуск |
продолжить выполнение |
SIGSTOP |
19 |
остановка |
сигнал безусловной остановки, нельзя заблокировать, игнорировать или переопределить |
SIGTSTP |
20 |
остановка |
клавиатурная остановка (Ctrl+Z) |
SIGTTIN |
21 |
остановка |
попытка чтения с терминала в фоновом процессе |
SIGTTOU |
22 |
остановка |
попытка записи на терминал в фоновом процессе |
Синтаксис функций и структур которые использовались в лабораторной работе приведен ниже:
Структура sigaction имеет следующий формат:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
sa_mask задает маску сигналов, которые должны блокироваться при обработке сигнала.
sa_flags содержит набор флагов, которые могут влиять на поведение процесса при обработке сигнала.
sa_sigaction используется в случае установки флага(SA_SIGINFO), так же задает обработчик для процесса
sa_handler задает тип действий процесса, связанный с сигналом signum.
Для получения детальной информации о сигнале использовалась структура
siginfo_t структура имеет следующий вид:
siginfo_t {
int si_signo; /* Номер сигнала */
int si_errno; /* Значение errno */
int si_code; /* Код сигнала */
pid_t si_pid; /* Идентификатор процесса, пославшего сигнал */
uid_t si_uid; /* Реальный идентификатор пользователя процесса, пославшего сигнал */
int si_status; /* Выходное значение или номер сигнала */
clock_t si_utime; /* Занятое пользователем время */
clock_t si_stime; /* Использованное системное время */
sigval_t si_value; /* Значение сигнала */
int si_int; /* Сигнал POSIX.1b */
void * si_ptr; /* Сигнал POSIX.1b */
void * si_addr; /* Адрес в памяти, приводящий к ошибке */
int si_band; /* Общее событие */
int si_fd; /* Описатель файла */
}
Синтаксис основных функций которые использовались в лабораторной работе приведен ниже:
int kill(pid_t pid, int sig); //посылка сигнала. если pid=0, сигнал посылается всем процессам группы
void (* signal(int sig, void(*func)(int nsig)))(int nsig2); //установка реакции на сигналы
//SIG_IGN - игнорировать
//SIG_DFL – установить реакцию по умолчанию
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); //расширенная обработка сигналов, например, процесс-получатель может определить процесс-отправителя
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); //маскирование и демаскирование сигналов