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

Лабораторные работы по курсу

Операционные системы

Лабораторная работа 5

Порождение процессов и межпроцессное взаимодействие в программах на языке C

2022

Оглавление

Список сокращений 4

Введение 5

1. Отправка и обработка сигналов 5

1.1. Отправка сигналов 5

1.2. Обработка сигналов 6

1.2.1. Интерфейс signals 6

1.2.2. Интерфейс sigaction 7

2. Порождение дочерних процессов 9

2.1. Системный вызов fork 9

2.2. Обмен данными с дочерним процессом 11

2.3. Системный вызов getpid 14

2.4. Системный вызов getppid 14

2.5. Системные вызовы семейства exec 14

3. Замещение дочерних процессов 16

3.1. Библиотечный вызов popen 16

3.2. Библиотечный вызов system 17

4. Обмен данными через именованные каналы 17

5. Упражнения 18

6. Индивидуальные задания 25

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

8. Список литературы 25

Список сокращений

ОС

Операционная Система

POSIX

Portable Operating System Interface

Введение

В предыдущих лабораторных работах были рассмотрены способы запуска процессов в командной оболочке, организации межпроцессного обмена данными и основы разработки программ на языке C для ОС Linux.

Целью данной лабораторной работы является освоение механизмов межпроцессного обмена данными и порождения дочерних процессов при разработке программ на языке C для ОС Linux.

  1. Отправка и обработка сигналов

    1. Отправка сигналов

В Лабораторной работе №2 был рассмотрен простейший механизм обмена данными между процессами с помощью отправки сигналов в командной оболочке через утилиту kill [ CITATION kil211 \l 1033 ]:

kill [-s sigspec | -n signum | -sigspec] pid | jobspec

где sigspec – название сигнала, signum – номер сигнала, pid – идентификационный номер процесса, а jobspec – номер запущенного фонового процесса.

Для отправки сигналов в программах на языке C может быть по аналогии использован системный вызов kill [ CITATION kil21 \l 1033 ]:

#include <sys/types.h>

#include <signal.h>

 

int kill(pid_t pid, int sig);

В случае успешной отправки сигнала в возвращаемом значении типа int будет 0, в случае неуспешной отправки -1, а код ошибки будет записан в errno. Сигнал отправляется в процесс с PID, указанному в аргументе pid_t pid. Если вместо PID указан 0, то сигнал передается каждому процессу, входящему в группу процесса-отправителя. Если в PID указан -1, то сигнал будет послан всем процессам, кроме процесса init. С помощью значений меньше -1 возможна отправка сигналов в группы процессов. Аргумент int sig указывает тип отправляемого сигнала. Если sig равно нулю, то системный вызов kill не отправляет сигнал, а проверяет ошибки отправки.

Процесс также может отправить сигнал самому себе с помощью библиотечного вызова raise [ CITATION rai21 \l 1033 ]:

#include <signal.h>

 

int raise(int sig);

в котором возвращаемое значение и входной аргумент int sig аналогичны системному вызову kill.

    1. Обработка сигналов

Для обработки поступающих в процесс сигналов ОС Linux автоматически создает обработчики, выполняющие функции по умолчанию при поступлении сигнала. Как правило, подавляющее большинство обработчиков немедленно завершают процесс ввиду того, что большинство сигналов обозначают возникновение ошибки на аппаратном или программном уровнях. Однако зачастую возникают ситуации, когда перед завершением процесса необходимо провести ряд действий. Например, записать несохраненные данные, завершить дочерние процессы, закрыть дескрипторы файлов и т.д. Для таких случаев и случаев использования механизма сигналов для штатной коммуникации между процессами ОС Linux позволяет в разрабатываемых программах создавать пользовательские обработчики, которые могут содержать произвольный код и назначать данные обработчики на один или несколько сигналов. Исключением являются только сигналы SIGKILL и SIGSTOP – они не могут быть перехвачены или проигнорированы и всегда должны приводить к завершению и остановке процесса соответственно.

Для назначения произвольных обработчиков в ОС Linux существуют два интерфейса [ CITATION Сиг \l 1033 ]:

  • signals;

  • sigaction.

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

Соседние файлы в папке OS_labs