Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПП.pdf
Скачиваний:
10
Добавлен:
02.06.2015
Размер:
288.49 Кб
Скачать

вследствие исчерпания времени задержки, и неиспользованное время, если она завершается по сигналу.

Процесс нормально завершает свою работу либо путем возврата управления из функции main, либо обращением к функции exit( int status). Через аргумент status процесс передает код завершения своему предку. Следует иметь в виду, что предку будут переданы только 8 младших бит аргумента status.

4.2. Подготовка к работе

Задание 1. Написать две программы. Первая программа должна породить процесс, выполняющий вторую программу, а затем ожидать его завершения. Второй программе в качестве параметра передается имя файла, существование которого она должна проверить. Если файл существует, то вторая программа передает первой номер дескриптора файла, в противном случае - 0. Первая программа должна вывести на экран результат работы второй программы.

Задание 2.

Написать

программу, в которой родительский процесс в цикле

построчно читает

входной

файл, порождает двух потомков и четную строку файла

передает первому потомку, а нечетную - второму. Потомки выводят полученные строки в конец двух выходных файлов и заканчивают работу. Предок ожидает завершения потомков и повторяет свой цикл, пока не прочтет последнюю строку входного файла.

4.3. Порядок выполнения работы

1.Вызвать текстовый редактор и набрать подготовленные программы и данные.

2.Откомпилировать программы и получить загрузочный модуль.

3.Выполнить программы первого задания и по результатам вывода убедиться в правильности их работы.

4.Выполнить программу второго задания, получить выходные файлы и по содержимому этих файлов проверить правильность работы программы.

4.4. Содержание отчета

Отчет по лабораторной работе должен содержать листинги программы и файлов результатов работы.

4.5. Защита работы

Для защиты лабораторной работы студенту необходимо знать набор системных вызовов и порядок их использования для синхронизации работы предка и потомков.

4.6. Контрольные вопросы

1. Каковы различия между системными функциями wait и waitpid?

14 - -

2.Как изменится поведение процесса, если задержка в программе будет организована не с помощью функции sleep, а циклом for?

Лабораторная работа 5 УПРАВЛЕНИЕ ПРОЦЕССАМИ С ПОМОЩЬЮ СИГНАЛОВ

Цель работы: знакомство с сигнальным механизмом и системными вызовами в ОС LINUX, обеспечивающими прием и передачу сигналов.

5.1. Общие сведения

Процессы могут сообщать о наступлении некоторого события посылкой друг другу сигналов. Сигналы различаются своими номерами, которые представляются целыми числами в диапазоне от 1 до 32 и определены в библиотечном файле /sys/signal.h.

Процесс может либо игнорировать сигнал, либо иметь стандартную или собственную реакцию. Каждый процесс имеет сигнальную маску, определяющую множество системных сигналов, которые не должны передаваться процессу. Эта маска наследуется процессом при порождении и может быть изменена. Для изменения маски используется функция int sigprocmask( int how, sigset_t* set, sigset_t* oset). Если параметр set не является нулевым указателем, то он указывает на заданную маску, которая используется для изменения текущей сигнальной маски. Параметр how указывает, как это изменение выполняется, и может принимать следующие значения: SIG_BLOCK - новая маска получается объединением текущей и заданной; SIG_UNBLOCK - новая маска получается пересечением текущей и заданной; SIG_SETMASK - новая маска становится равной заданной.

Если параметр oset не является нулевым указателем, то текущая маска запоминается по этому указателю. При нулевом указателе set параметр how не учитывается и текущая маска не меняется, что позволяет использовать функцию sigprocmask для получения текущей маски по указателю oset. При успешном завершении функция возвращает 0, а в случае ошибки -1, не меняя текущую маску.

Перехват сигнала можно организовать с помощью системных функций signal(int signum, unsigned long handler) и sigaction(int signum, const struct sigaction * action, struct sigaction * oldaction). Параметрами функции signal являются: номер сигнала и имя функции, выполняющей реакцию на этот сигнал, а параметрами функции sigaction - номер сигнала, описание новой и предыдущей реакций на сигнал. Необходимо помнить, что сигналы SIGKILL и SIGSTOP не могут перехватываться, а сигнал SIGINT воспринимают только процессы, связанные в данный момент с клавиатурой. Функции signal и sigaction можно также использовать для блокирования сигнала и восстановления стандартной реакции на сигнал. Для этого в качестве реакции на сигнал необходимо указать соответственно символические константы SIG_IGN и SIG_DEL. Реакция в

15 - -

функции sigaction описывается в параметре action, который имеет тип struct sigaction, определенный в библиотечном файле /sys/signal.h. В полях этой структуры указываются: имя перехватывающей функции, дополнительная маска, которая должна блокировать сигналы во время выполнения перехватывающей функции, и флаги SA_NOMASK или SA_ONESHOT. Первый флаг указывает, что дополнительная сигнальная маска не используется, и в этом случае значение, хранящееся в поле sa_mask, не учитывается. Второй флаг является признаком сброса реакции на данный сигнал и установки стандартной реакции на сигнал после выполнения перехватывающей функции.

Процесс может послать сигнал себе, своему предку или потомку. Для этого в программе нужно вызвать функции kill или raise, которые соответственно имеют следующие описания: int kill( pid_t pid, int sig) и int raise( int sig). В параметре pid

передается идентификатор процесса, которому посылается сигнал, а в параметре sig - значение сигнала. Если pid равен 0, то сигнал посылается всем процессам, входящим в ту же группу, что и процесс, посылающий сигнал. Функция raise генерирует сигнал sig только для текущего процесса. При успешном завершении функции возвращают 0, а в случае ошибки -1.

Функция kill любой сигнал немедленно посылает процессу. Однако сигнал SIGALRM процесс может послать сам себе не сразу, а через некоторое время. Этот сигнал посылается процессу программным таймером, установку которого осуществляет функция alarm (unsigned seconds ). В качестве параметра функции указывается, через сколько секунд должен быть послан сигнал SIGALRM. Следует помнить, что запросы на установку программного таймера не накапливаются. Если очередное обращение к функции alarm произойдет раньше чем программный таймер пошлет сигнал SIGALRM, то предыдущая установка будет заменена новой.

Программный таймер можно установить так, чтобы он периодически посылал процессу сигнал SIGALARM. Для этого нужно вызвать функцию int setitimer (TIMER_REAL, struct itimerval * value, struct itimerval *ovalue). Аргумент value задает начальные установки программного таймера, а в аргументе ovalue возвращаются его текущие характеристики. Оба аргумента должны быть описаны как указатель на структуру itimerval, определенную в библиотечном файле sys/time.h . Cтруктура itimerval в свою очередь состоит из двух подструктур типа timerval. Подструктура it_value содержит время посылки первого сигнала SIGALARM процессу с момента выполнения им функции setitimer, а подструктура it_interval хранит период повторения сигнала. Если период будет равен 0, то сигнал посылается процессу только один раз. Время посылки первого сигнала и период повторения задаются в секундах и микросекундах, которые соответственно записываются в поля tv_sec и tv_usec.

Функция pause( ) позволяет задержать процесс до получения им неблокированного сигнала, который либо перехватывается, либо влечет завершение процесса. Если сигнал вызывает завершение процесса, то функция pause не возвращает управление.

16 - -

5.2. Подготовка к работе

Задание 1. Написать две периодические программы. Период запуска и время работы каждой программы должны задаваться в качестве их параметров. При каждом очередном запуске программы должны выводить на экран время старта. Обе программы должны быть заблокированы от завершения при нажатии клавиш Ctrl/z.

Задание 2. Написать программу, которая реагирует и локализует ошибки в арифметических выражениях(переполнение, деление на нуль). При обнаружении ошибки программа должна вывести сообщение, какая произошла ошибка, и продолжить работу.

5.3. Порядок выполнения работы

1.Вызвать текстовый редактор и набрать подготовленные программы.

2.Откомпилировать программы и получить загрузочные модули.

3.Запустить программы из задания 1 на одном терминале, а команду top - на другом

инаблюдать как работают периодические программы.

4.Запустить программу из задания 2, в которой имеется несколько операторов с ошибками в арифметических выражениях.

5.4. Содержание отчета

Отчет по лабораторной работе должен содержать листинг программы с комментариями.

5.5. Защита работы

Для защиты лабораторной работы студенту необходимо знать: сигнальный механизм управления процессами; набор системных вызовов и порядок их использования для взаимодействия работы предка и потомков; правила описания перехватывающей функции.

5.6. Контрольные вопросы

1.Как может отреагировать процесс на сигнал?

2.Какую начальную маску имеет процесс?

3.Что надо сделать, чтобы изменить реакцию при повторном приеме сигнала?

4.Что может произойти, если перехватывающая функция не будет начинаться с вызова функции signal?

5.Какие запущенные процессы и как будут реагировать на сигнал SIGINT?

Лабораторная работа 6 ОБМЕН ДАННЫМИ ЧЕРЕЗ КАНАЛ

17 - -