- •Исследование моделей взаимодействия процессов именованные каналы
- •1. Цель работы
- •2. Краткие теоретические сведения
- •2.1 Именованные каналы
- •2.2 Открытие именованного канала
- •2.3 Удаление файлов
- •2.4 Пример программы
- •3. Задания на лабораторную работу
- •5. Порядок выполнения лабораторной работы
- •6. Содержание отчета о выполнении лабораторной работы
- •7. Порядок защиты работы
- •8. Контрольные вопросы
- •Библиографический список
- •Приложение а (справочное) текст программы lr6_client
- •4. ТехническиЕ средствА для выполнения работы.
- •Приложение б (справочное) Текст программы lr6_server
2.2 Открытие именованного канала
Системный вызов open() при открытии FIFO ведет себя иначе, чем при открытии других типов файлов, что связано с возможностью блокирования выполняющих его процессов.
Если FIFO открывается только чтения, и не задан флаг O_NDELAY, то процесс, осуществивший системный вызов, блокируется до тех пор, пока какой-либо другой процесс не откроет FIFO на запись.
Если флаг O_NDELAY задан, то возвращается значение файлового дескриптора, ассоциированного с FIFO.
Если FIFO открывается для записи, и не задан флаг O_NDELAY, то процесс, осуществивший системный вызов, блокируется до тех пор, пока какой-либо другой процесс не откроет FIFO на чтение.
Если флаг O_NDELAY задан, то констатируется возникновение ошибки и возвращается значение -1.
Задание флага O_NDELAY в параметрах системного вызова open() приводит и к тому, что процессу, открывшему FIFO, запрещается блокировка при выполнении последующих операций чтения из этого потока данных и записи в него.
На рис. 3 показан пример открытия именованного канала на запись и чтение, который был предварительно создан mknod().
if((fd
= open("a.fifo", O_WRONLY)) < 0){
/* Если открыть
FIFO не удалось, печатаем об этом
сообщение и
прекращаем работу */
printf("Can\'t
open FIFO for writing\n");
exit(-1);
Рис. 3 – Создание именованного канала
В случае успеха open() возвращает файловый дескриптор, при неудаче отрицательное значение.
После открытия именованный pipe ведет себя точно так же, как и неименованный. Для дальнейшей работы с ним применяются системные вызовы read(), write() и close().
2.3 Удаление файлов
Перед созданием именованного канала следует убедится, что имя файла метки не используется в файловой системе.
Удалить при необходимости файл можно при помощи функции unlink(), которая удаляет указанный файл из каталога.
В случае успеха функция возвращает 0, а при неудаче —1. Пример использования функции unlink приведен на рис.4.
Рис. 4 – Удаление файла
2.4 Пример программы
Устройство сообщает о своем состоянии с помощью нескольких чисел.
Состояние устройства представляется в виде кода состояния (C – число в диапазоне от 0 до 31), признака ошибки (F – 1/0), признака занятости (B – 0/1), количества байт, переданных в последней операции (N – число в диапазоне от 0 до 255).
Эти числа объединяются в одно слово состояния устройства, формируемое способом представленным в таблице 1.
Таблица 1 – Слово состояния устройства
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
значение |
C |
C |
C |
C |
C |
0 |
F |
B |
N |
N |
N |
N |
N |
N |
N |
N |
Для примера разработаны две программы. Программа client_lr6 запрашивает у пользователя неупакованные части слова состояния устройства и упаковывает их, используя самостоятельную программу упаковки, запущенную в отдельном процессе. Два процесса взаимодействуют через именованные каналы, которые создаются программой server _lr6.
Программа server _lr6 должна быть запущена первой.
Пара программ server _lr6 и client_lr6 представляют собой пример программной реализации модели клиент-сервер.
В программе-сервере pack реализован сервис упаковки слова состояния. В программе client_lr6 реализован пользовательский интерфейс.
Эта программа использует сервис, который реализован в server _lr6, поэтому client_lr6 называют клиентом программы server _lr6.
Полный текст программ приведен в приложениях А и Б.
