Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.практикумСП.doc
Скачиваний:
39
Добавлен:
31.03.2015
Размер:
5.99 Mб
Скачать

12.8. Задания для самостоятельной работы

1. Разработайте программу на языке Си, которая порождала бы процесс потомок, и убедитесь в том, что все файлы, открытые процессом предком, открыты и для процесса потомка.

2. Разработайте программу на языке Си для подсчета частоты вхождения слова в состав некоторого текстового файла для каждого хранящегося в этом файле слова.

3. Разработайте программу на языке Си с использованием системного вызова sort, которая сортирует файл, указанный в командной строке.

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

5. Разработайте программу на языке Си, которая берет единственный целочисленный аргумент n из командной строки и создает двоичное дерево процессов глубины n. Когда дерево создано, каждый процесс должен вывести фразу “Я процесс х”. Узлы дерева процесса должны перечисляться согласно обходу в ширину.

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

  1. Как родитель может выяснить, каким образом умерли его потомки?

  2. В чем состоит различие между системными вызовами execl и execv?

  3. Как происходит ожидание родительским процессом своих потомков?

  4. Как происходит дублирование дескриптора файла?

  5. Как происходит создание нового процесса?

ЛИТЕРАТУРА

  1. Глас Г., Эйблс К. Unix для программистов и пользователей. / Г. Глас, К. Эйблс – СПб.: БХВ-Петербург, 2004. – 848 с.: ил.

  2. Дансмур М., Дейвис Г. Операционная система Unix и программирование на языке Си. / М. Дансмур, Г. Дейвис – М.: Радио и связь, 1989. – 192 с.:ил.

ЛАБОРАТОРНАЯ РАБОТА 13.

СРЕДСТВА И СПОСОБЫ КОММУНИКАЦИИ ПРОЦЕССОВ

13.1. Цель работы

Целью работы является изучение двух основных средств коммуникации процессов ОС UNIX – так называемые сигналы, представляющие собой средство синхронизации выполнения нескольких процессов, и каналы, реализующие собственно функцию передачи данных от одного процесса ОС UNIX другому.

13.2. Сигналы

Сигнал – это программное средство, с помощью которого может быть прервано функционирование процесса ОС UNIX. Механизм сигналов позволяет процессам реагировать на различные события, которые могут произойти в ходе функционирования процесса внутри него самого или во внешнем мире. Как правило, получение некоторым процессом сигнала указывает ему на необходимость завершить свое функционирование, вместе с тем реакция процесса на принимаемый сигнал зависит от того, как сам процесс определил свое поведение в случае приема им данного сигнала. Например, получив сигнал, процесс может его просто проигнорировать или вызвать на выполнение некоторую программу (аналогичную программе обработки прерывания). В последнем случае, выполнив на выполнение программу, процесс сможет продолжить свое функционирование с той точки исходной программы, в которой процесс получил, соответствующий сигнал.

Итак, процессы ОС UNIX могут принимать и обрабатывать сигналы. Каждому сигналу ставятся в соответствие номер сигнала – целое положительное число и строковая константа, используемая для осмысленной идентификации сигнала. В таблице 13.1 представлены некоторые сигналы ОС UNIX.

Таблица 13.1

Сигналы

Мнемоника

Номер

Описание

SIGUP

1

Разрыв связи или зависание

SIGINT

2

Сигнал прерывания

SIGQUIT

3

Аварийный выход

SIGILL

4

Неверная машинная конструкция или неправильная команда

SIGTRAP

5

Системное прерывание трассировки

SIGIOT

6

Прерывание ввода – вывода

SIGEMT

7

Программное прерывание EMT

SIGFPE

8

Авария при выполнении операции с плавающей точкой

SIGKILL

9

Уничтожение процесса

SIGBUS

10

Ошибка шины

SIGSEGV

11

Нарушение сегментации

SIGSYS

12

Ошибка выполнения системного вызова

SIGPIPE

13

Запись в канал есть, чтения нет

SIGALRM

14

Прерывание от таймера

SIGTERM

15

Программное прерывание

SIGUSR1

16

Определяется пользователем

SIGUSR2

17

Определяется пользователем

SIGCLD

18

Процесс потомок завершился

SIGPWR

19

Авария питания

Перечислим события, которые могут стать причиной посылки сигнала:

  • введение пользователем управляющего символа с терминала всем процессам, входящим в группу процессов, ассоциированных с этим терминалом, будет послан один из следующих сигналов: SIGINT, SIGQUIT или SUGHUP;

  • возникновение аварийной ситуации при функционировании пользовательского процесса. Всем процессам будет послан один из следующих сигналов: SIGILL, SIGTRAP, SIGFPE, SIGBUS, SIGSEGV, SIGSYS или SIGPIPE;

  • возникновение некоторого заранее описанного события. Всем процессам будет послан сигнал SIGALRM;

  • возникновение непредусмотренного или не поддающегося идентификации события. Всем процессам будет послан один из следующих сигналов: SIGTERM, SIGCLD или SIGPWR.

Самый легкий способ послать сигнал приоритетному процессу – это нажать комбинацию клавиш <Ctrl>+<C> или <Ctrl>+<Z>. Когда драйвер терминала распознает комбинацию клавиш <Ctrl>+<C>, он посылает сигнал SIGINT всем текущим приоритетным процессам. Точно так же комбинация клавиш <Ctrl>+<Z> заставляет драйвер посылать сигнал SIGTSTP всем текущим приоритетным процессам. По умолчанию SIGINT заканчивает, а SIGTSTP приостанавливает процесс.

Возникновение любого события может сопровождаться посылкой всем или некоторым процессам любого сигнала, для чего процессу достаточно осуществить вызов kill (сигналы SIGUSR1, SIGUSR2 и SIGKILL вообще могут быть посланы только таким образом). Системный вызов kill имеет следующий формат: kill(pid, sig). В результате осуществления такого системного вызова сигнал, специфицированный аргументом sig, будет послан всем тем процессам, которые являются родственниками процесса с идентификатором процесса pid. Если при этом значение аргумента pid не превосходит положительного целого числа 1, то специфицированный сигнал будет послан целой группе процессов. Например, если аргумент pid имеет значение 0, то сигнал, специфицированный аргументом sig, будет послан всем процессам с идентификатором группы, совпадающими с идентификатором группы процесса, который осуществил системный вызов kill, кроме процессов с идентификаторами процесса 0 и 1.

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

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

При удачном завершении выполнения системного вызова kill последний возвращает целое число 0, в противном случае – целое число -1. Причиной аварийного завершения выполнения системного вызова kill может послужить, например, спецификация несуществующего в ОС UNIX сигнала или спецификация несуществующего процесса.

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

Рассмотрим теперь ряд примеров. Приведем фрагмент исходного текста на языке Си

kill(0, SIGFPE);

в результате выполнения которого всем процессам одной группы будет послан сигнал о возникновении исключительной ситуации в случае выполнения арифметической операции. При выполнении фрагмента программы на языке Си

kill(37, SIGKILL);

процесс с идентификатором процесса 37 будет аварийно завершен. И, наконец, еще один пример. В результате выполнения фрагмента программы на языке Си

kill(getpid(), SIGALRM);

сигнал побудки будет послан самому процессу, осуществившему системный вызов kill.