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

Министерство образования и науки Украины

Севастопольский национальный технический университет

ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ: ПРОГРАММНЫЕ КАНАЛЫ

Часть 2

Методические указания

к выполнению лабораторной работы № 5

по дисциплине «Системное программирование»

для студентов направления подготовки

050201 «Системная инженерия»

дневной формы обучения

Севастополь

2009

УДК 681.5

Взаимодействие процессов: программные каналы. Часть 2: Методические указания к выполнению лабораторной работы № 5 по дисциплине «Системное программирование» для студентов направления подготовки 050201 «Системная инженерия» дневной и заочной форм обучения / Разраб. Д.Н. Старинская, П.Л. Светличный. – Севастополь: Изд-во СевНТУ, 2009. – 14 с.

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

Методические указания предназначены для студентов по направлению подготовки 050201 «Системная инженерия» дневной и заочной форм обучения.

Методические указания рассмотрены и утверждены на заседании кафедры

технической кибернетики,

протокол № от « » 2009 г.

Допущено учебно-методическим центром и научно-методическим советом СевНТУ в качестве методических указаний.

Рецензент:

1Цель работы

Изучение системных вызовов Linux, предназначенных для управления пользовательскими процессами. Изучение механизма взаимодействия отдельных процессов посредством программных каналов.

2 Задание на работу

Напишите программу, которая на основе задания лабораторной работы №2, запрашивает у пользователя упакованные слова состояния устройства и распаковывает их, используя самостоятельную программу распаковки, запущенную в отдельном процессе. Такая модель взаимодействия процессов называется «клиент-сервер». Требуется создать два процесса, взаимодействующих через программный канал. Программа-клиент должна работать по следующему алгоритму:

  1. создавать два программных канала.

  2. Создавать новый процесс для выполнения программы распаковки.

  3. В новом процессе перенаправить stdin и stdout на программные каналы, а затем выполнить exec для программы распаковки.

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

Программа распаковки (сервер) должна быть откомпилирована в отдельном файле. Она должна читать с клавиатуры одно упакованное число и выводить на экран распакованные элементы состояния устройства.

В программах должен быть предусмотрен вывод на экран промежуточных результатов (идентификаторов процессов, результатов распаковки и т.п.).

3 Краткие теоретические сведения-

3.1 Дублирование файловых дескрипторов

Иногда процессам требуется создать новый файловый дескриптор, который ссылается на ранее открытый файл. Если процессу не важно, какой файловый дескриптор будет использован для новой ссылки, он должен применить системный вызов dup().

#include <unistd.h>

int dup(int oldfd);

Вызов: newfd = dup(oldfd);

Системный вызов dup() возвращает файловый дескриптор, который ссылается на тот же inode, чо и oldfd, или -1 в случае ошибки. Дескриптор oldfd по-прежнему ссылается на исходный файл. Новый файловый дескриптор – это всегда наименьший доступный файловый дескриптор. Если процессу нужно получить новый файловый дескриптор с определенным значением (например 0, чтобы перенаправить стандартный ввод), то следует использовать системный вызов dup2().

#include <unistd.h>

int dup2(int oldfd, int newfd);

Вызов: newfd = dup2(oldfd, newfd);

Если дескриптор newfd был прежде связан с каким-то файлом, то сначала старое соединение закрывается. Если системный вызов dup2() завершен успешно, он возвращает новый файловый дескриптор, newfd, ссылающийся на тот же файл, что и oldfd.

Вызов newfd = dup2(oldfd, newfd) эквивалентен паре вызовов close(newfd); newfd = dup(oldfd).

Создание двух файловых дескрипторов, ссылающихся на один и тот же файл, – это не то же самое, что открытие файла дважды. Почти все атрибуты дублированных дескрипторов сохраняются: они разделяют текущую позицию, режимы доступа и блокировки. Единственный атрибут, который может независимо управляться в этих двух дескрипторах, – это состояние «закрыть при выполнении».

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