Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






FIFO-очереди (именованные каналы),






 

Методы, которые мы использовали для реализации объектно-ориентированных анонимных каналов, обладают двумя недостатками. Во-первых, любым процессам, которые взаимодействуют с другими процессами, нужен доступ к файловым дескрипторам, возвращаемым при вызове системной функции pipe (). Поэтому существует проблема получения этих файловых дескрипторов для всех процессов-участников. Эта проблема легко решается, если процессы связаны отношение м «родитель-потомок» (как в програ мм ах 11.1, 11.2 и 11.2.1), но в это м случае возникает другая проблема. Выходит, во-вторых, что процессы, которые используют неи м енованные каналы, должны быть связаны отношения м и. Это требование можно обойти с помощью схемы передачи дескриптора. Для решения этой проблемы используется структура FIFO (First In — First Out — первым прибыл, первым обслужен). Самое большое ее достоинство как раз и состоит в том, что к ней могут получить доступ процессы, не связанные никакими отношениями. Процессы должны выполняться на одном компьютере — это единственное, что должно их связывать. При этом процессы могут запускаться программами, реализованными на разных языках программирования и с использованием различных парадигм программирования (например, обобщенной или объектно-ориентированной). При групповых вычислениях и при использовании других конфигураций равноправных элементов можно воспользоваться преимуществами FIFO-очередей (иногда называе м ых именованными каналами), поскольку в UNIX- и Linux-среде FIFO-структура имеет имя (определяемое пользователем) и ее (в отличие от анонимных каналов) можно сравнить с «капитальным сооружением». FIFO — однонаправленная структура, а это значит, что пользователь именованного канала в среде UNIX должен открыть его либо для чтения, либо для записи, но не для того и другого одновременно. Именованные каналы, созданные в среде UNIX, остаются в файловой системе до тех пор, пока они не будут явно удалены с помощью вызова из программы функции unlink() или выполнения соответствующей команды из командной строки (например, команды rm). Именованным каналам при их создании присваивается эквивалент имени файла. Любой процесс, которому известно имя канала и который обладает необходимыми правами доступа, может открыть его, прочитать из него данные и записать их туда.

Чтобы связать анонимные каналы с объектами классов ifstream и ofstream, мы использовали нестандартное связывание с файловым дескриптором. Нестандартность ситуации вытекает из того, что «брак» между файловыми дескрипторами и iostreams-объектами пока не «освящен» стандартом ISO С++. Поэтому безопаснее использовать FIFO-структуры. К FIFO-файлу специального типа можно получить доступ с помощью имени в файловой системе, в которой «официально» поддерживается связывание с объектами С++-классов ifstream и ofstream. Поэтому точно так же, как мы упрощали межпроцессное взаимодействие (IPC) с помощью iostream-классов и анонимного канала, мы упрощаем доступ к FIFO-структуре. FIFO-структура, основные функции которой совпадают с функциями анонимного канала, позволяет распространить возможности взаимодействия на классы, не связанные никакими родственными отношениями. Однако каждая программа — участник взаимодействия должна при этом «знать» имена FIFO-структур. Это требование, казалось бы, напоминает ограничение, с котороым мы встречались при использовании файловых дескрипторов. Однако FIFO — это все же «шаг вперед». Во-первых, при открытии анонимного канала только система определяет, какие файловые дескрипторы доступны в данный момент. Это означает, что программист не в состоянии полностью контролировать ситуацию. Во-вторых, существует ограничение на количество файловых дескрипторов, котороми располагает система. В-третьих, поскольку FIFO-структурам имена присваиваются пользователем, то количество таких имен не ограничивается. Файловые дескрипторы должны принадлежать файлам, открытым ранее (и причем успешно), а FIFO-имена — это всего лишь имена. FIFO-имя определяется пользователем, а файловые дескрипторы— системой. Имена файлов связываются с объектами классов ifstream, fstream и ofstream с помощью либо конструктора класса либо метода open(). В программе 11.3.1 для связывания объектов классов ofstream и ifstream с FIFO-структурой используется конструктор.

// Программа 11.3.1

14 using namespace std;

16 const int FMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

18 int main(int argc, char *argv[])

19 {

21 int Pid, Status, Size;

22 double Value;

25 mkfifo(" /tmp/channel.l», FMode);

26 mkfifo (" / tmp/channel. 2», FMode);

28 vector< double> X(100, 13.0);

29 vector< double> Y;

30 ofstream OPipe(" /tmp/channel.l», ios:: app);

31 ifstream IPipe(" /tmp/channel.2»);

32 OPipe < < X.size() «endl;

33 ostream_iterator< double> Optr(OPipe, " \n»);

34 copy(X.begin(), X.end(), Optr);

35 OPipe «flush;

36 IPipe» Size;

37 for (int N = 0; N < Size; N++)

38 {

39 IPipe» Value;

40 Y.push_back(Value);

41 }

43 IPipe.close();

44 OPipe.close();

45 unlink(" /tmp/channel.1»);

46 unlink(" /tmp/channel.2»);

47 cout «accumulate(Y.begin(), Y.end(), -13.0) «endl;

49 return(0);

50 }

В программе 11.3.1 используется две FIFO-структуры. Вспомните, что FIFO-структуры являются однонаправленными компонентами. Поэтому, если процессы должны обмениваться данными, то необходимо использовать по крайней мере две FIFO-структуры. В программе 11.3.1 они называются channel.1 и channel.2. Обратите внимание на установку флагов полномочий для FIFO-структур (строка 16). Эти полномочия означают, что владелец FIFO-структуры имеет право доступа для чтения и записи, а все остальные — право доступа только для чтения. При выполнении строки 30 FIFO-структура channel.1 будет открыта только для вывода данных. Тот же результат можно было бы получить следующим образом: OPipe. open (" /tmp/channel.1», ios:: app);

Используемые здесь параметры алгоритма open () означают, что FIFO-структура будет открыта в режиме дозаписи. В программе 11.3.1 алгоритм copy () используется для вставки объектов в объект OPipe типа fstream и косвенно в FIFO-структуру. Мы могли бы также использовать здесь объект типа

fstream: fstreamOPipe(" /tmp/channel.l», ios:: out | ios:: app);

В этом случае взаимодействие процессов было бы ограничено выводом данных только в режиме дозаписи. Если бы мы не использовали флаг ios:: app, попытка объекта типа ofstream создать FIFO-сгруктуру (см. строку 30) была бы неудачной.

К сожалению, такой вариант работать не будет. Создание FIFO-структур находится в компетенции функции mkfifo(). В строках 45 и 46 программы 11.3.1 FIFO-структуры удаляются из файловой систе м ы. С этого м о м ента любые процессы, в которых открыты FIFO-структуры, еще в состоянии получить к ним доступ. Однако их имен больше не существует. Поэтому такие процессы не смогут использовать алгоритм open() или создать новые объекты типа ofstream или ifstream на основе и м ени, которое было «отсоединено». В строках 32-34, объекты типа ostream_ iterator и ofstream используются для вставки эле м ентов в FIFO-структуру. Обратите вни м ание на то, что програ мм а 11.3.1 не образует никаких ветвлений и не создает сыновних процессов. Программа 11.3.1 зависит от другой програ мм ы, которая должна считывать инфор м ацию из FIFO-структуры channel. 1 или записывать инфор м ацию в FIFO-структуру channel. 2. Если такая программа не будет работать одновременно с программой 11.3.1, последняя останется заблокированной. Детали реализации приведены в разделе «Профиль программы 11.3.1».

Профиль программы 11.3.1

Имя программы program11-3a.cc

Описание Для пересылки контейнерного объекта через FIFO-структуру используются объекты ТИпа ostream_iterator и ofstream. Для извлечения информации из FIFO-структуры применяется объект типа ifstream.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.