Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab7OS.doc
Скачиваний:
11
Добавлен:
01.03.2016
Размер:
72.19 Кб
Скачать

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); //маскирование и демаскирование сигналов

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]