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

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.

Frame4

Рис. 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.

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

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