25 vector X;
26 multiplier R(1.5);
27 sleep(15);
28 fstream IPipe("/tmp/channel.1»);
29 ofstream OPipe("/tmp/channel.2»,ios::app);
30 if(IPipe.is_open()){
31 IPipe » Size;
32 }
33 else{
34 exit(l);
35 }
36 cout « «Количество элементов " << Size << endl;
37 for(int N = 0;N < Size;N++)
38 {
39 IPipe » Data;
40 X.push_back(Data);
41 }
42 OPipe « X.size() « endl;
43 ostream_iterator Optr(OPipe,"\n»);
44 transform(X.begin(),X.end(),Optr,R);
45 OPipe << flush;
46 OPipe.close();
47 IPipe.close();
48 return(0); 49
50 }
Обратите внимание на то, что в программе 11.3.1 FIFO-стуктура channel.lоткрывается для вывода данных, а в программе 11.3.2 та же FIFO-структура channel. 1 —для ввода данных. Слелует иметь в виду, что FIFO-структуры действуют как однонаправленные механизмы связи, поэтому не пытайтесь пересылать данные в обоих направлениях! Достоинство использования iostreams-классов в сочетании с FIFO-структурами состоит в том, что мы можем использовать iostreams-методы применительно к FIFO-структурам. Например, в строкеЗО мы используем метод is_open()класса basic_filebuf,который позволяет определить, открыта ли FIFO-структура. Если она не открыта, то программа 11.3.2 завершается. Детали реализации программы 11.3.2 приведены в разделе «Профиль программы 11.3.2».
Профиль программы 11.3.2
Имя программы
programll-3b.ee
Описание
Программа считывает объекты из FIFO-структуры с помощью объекта типа ifstream. Для пересылки данных через FIFO-структуру здесь используется итератор типа ostream_iterator и стандартный алгоритм transform.
Требуемые заголовки
>, , , , , , , , , , , ^, .
Инструкции по компиляции и компоновке программ
с++ -о programll-3b programll-3b.сс
; Среда для тестирования
SuSE Linux 7.1, GCC 2.95.2, Solaris 8, Sun Workshop 6.0.
Инструкции по выполнению
program11.3a & program11-3b
Примечания
Cначала запускается программа11.3.1. Программа11.3.2 содержит инструкцию Sleep, которая восполняет собой отсутствие реальной синхронизации.
Упростить межпроцессное взаимодействие (IPC) можно не только с помощью iostreams-классов или классов istream_iterator и ostream_iterator, но и посредством инкапсуляции FIFO-механизма в FIFO-классе (листинг 11.23).
// Листинг 11.23. Объявление FIFO-класса
class fifo{
mutex Mutex;
//.. .
protected:
string Name; public:
fifo &operator<<(fifo &In, int X);
fifo &operator<<(fifo &In, char X);
fifo &operator>>(fifo &Out, float X);
//.. .
};
В этом случае мы можем легко создавать объекты класса fifo с помощью конструктора, а также передавать их как параметры и принимать в качестве значений, возвращаемых функциями. Мы можем использовать их в сочетании с классами стандартных контейнеров. Применение такой конструкции значительно сокращает объем кода, необходимого для функционирования FIFO-механизма. Более того, «классовый» подход создает условия для обеспечения типовой безопасности и вообще позволяет программисту работать на более высоком уровне.
Под каркасным понимается класс (или целал коллекция классов), который имеет заранее определенную структуру и представляет обобщенную модель поведения. Точно так же, как программы обеспечивают общие решения для конкретных задач, каркасные классы предоставляют конкретные решения для классов задач. Другими словами, каркас приложений содержит общую направленность выполнения кода для целого диапазона программ, которые решают задачи подобным образом. Поскольку каркас приложений представляет одно решение для семейства задач, то их можно назвать обощенными автономными мини-приложениями. .Каркасный класс служит своего рода проектом для мини-приложения. Он предлагает фунда м ентальную структуру (скелет), которую должно иметь приложение, не навязывал никаких деталей. Каркасный класс определяет отношения, распределяет обязанности, намечает порядок действий и протоколы между частями ПО в объектно-ориентированной архитектуре. Например, мы можем спроектировать класс языкового процессора, который должен содержать общую схему работы для целого диапазона приложений. Эта схема должна определить действия, которые необходимо выполнить для преобразования некоторого входного языка в за д анный выходной формат. Такой каркас состоит из нескольких об щ их частей ПО:
Читать дальше