ОТКРЫТИЕ ИМЕНОВАННОГО КАНАЛА




Содержание

1. Цель работы... 3

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

2.1 ИМЕНОВАННЫЕ КАНАЛЫ... 3

2.2 ОТКРЫТИЕ ИМЕНОВАННОГО КАНАЛА.. 4

2.3 УДАЛЕНИЕ ФАЙЛОВ.. 5

2.4 пример программы... 6

3. задания на лабораторную работу.. 6

4. техническиЕ средствА ДЛЯ выполнения работы. 8

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

6. Содержание отчета о выполнении лабораторной работы... 9

7. Порядок защиты работы... 9

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

Библиографический список.. 9

приложение а.. 10

приложение Б. 14

 

Цель работы

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

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

ИМЕНОВАННЫЕ КАНАЛЫ

Для организации потокового взаимодействия любых процессов в операционной системе UNIX применяется средство связи, получившее название FIFO (от First Input First Output) или именованный pipe. FIFO во всем подобен pip'у, за одним исключением: данные о расположении FIFO в адресном пространстве ядра и его состоянии процессы могут получать не через родственные связи, а через файловую систему.

Для этого при создании именованного pip'a на диске создается файл специального типа, обращаясь к которому процессы могут узнать интересующую их информацию. Для создания FIFO применяется системный вызов mknod() (рис. 1)

 

 

Рис. 1 – Системный вызов mknod().

 

Pathname указывает обычное имя каталога Unix и имя FIFO. Режим указывается константой S_IFIFO из заголовочного файла <sys/stat.h>, параметр dev обычно устанавливается равным нулю.

Здесь же указываются права доступа. Пример создания именованного канала, с меткой a.fifo, с правами на чтение и запись для всех пользователей показан на рис.2.

Рис. 2 – Создание именованного канала

 

При создании FIFO реально устанавливаемые права доступа получаются из стандартной комбинации параметра mode и маски создания файлов текущего процесса umask, а именно – они равны (0777 & mode) & ~umask.

Чтобы временно устранить влияние значения umask текущего процесса наустанавливаемые права доступа, перед вызовом mknod, можно использовать системный вызов umask(0).

При успешном создании FIFO функция возвращает значение 0, при неуспешном – отрицательное значение.

Файл типа FIFO не служит для размещения на диске информации, которая записывается в именованный pipe.

Эта информация располагается внутри адресного пространства операционной системы, а файл является только меткой, создающей предпосылки для ее размещения и позволяет осуществить реальную организацию FIFO в памяти при его открытии с помощью системного вызова open().

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

Когда все процессы, работающие с FIFO, закрывают все файловые дескрипторы, ассоциированные с ним, система освобождает ресурсы, выделенные под FIFO.

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

ОТКРЫТИЕ ИМЕНОВАННОГО КАНАЛА

Системный вызов 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 ().

УДАЛЕНИЕ ФАЙЛОВ

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

Удалить при необходимости файл можно при помощи функции unlink(), которая удаляет указанный файл из каталога.

В случае успеха функция возвращает 0, а при неудаче —1. Пример использования функции unlink приведен на рис.4.

 

Рис. 4 – Удаление файла

 

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

Устройство сообщает о своем состоянии с помощью нескольких чисел.

Состояние устройства представляется в виде кода состояния (C – число в диапазоне от 0 до 31), признака ошибки (F – 1/0), признака занятости (B – 0/1), количества байт, переданных в последней операции (N – число в диапазоне от 0 до 255).

Эти числа объединяются в одно слово состояния устройства, формируемое способом представленным в таблице 1.

Таблица 1 – Слово состояния устройства

№ разряда                                
значение C C C C C   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.

Полный текст программ приведен в приложениях А и Б.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: