Параллельное и распределенное программирование на С++
Шрифт:
К сожалению, такой вариант работать не будет. Создание FIFO-структур находится в компетенции функции mkfifo. В строках 45 и 46 программы 11.3.1 FIFO-структуры удаляются из файловой систе м ы. С этого м о м ента любые процессы, в которых открыты FIFO-структуры, еще в состоянии получить к ним доступ. Однако их имен больше не существует. Поэтому такие процессы не смогут использовать алгоритм open или создать новые объекты типа ofstream или ifstream на основе и м ени,
Профиль программы 11.3.1
Имя программы program11-3a.cc
Описание Для пересылки контейнерного объекта через FIFO-структуру используются объекты ТИпа ostream_iterator и ofstream. Для извлечения информации из FIFO-структуры применяется объект типа ifstream.
Требуемые заголовки
<unistd.h>, <iomanip>, <algorithm>, <fstream.h>,<vector>,<iterator> <strstream.h>, <stdlib.h>, <sys/wait.h>, <sys/types.h>, <sys/stat.h> <fcntl.h>, <numeric>.
Инструкции по компиляции и компоновке программ
с++ -о program11-3a program113a.сс
Среда для тестирования
SuSE Linux 7.1, gcc 2.95.2, Solaris 8, Sun Workshop 6.
Инструкции по выполнению
./program11-3a & program11-3b
Примечания
Сначала запускается программа 11.3.1. Программа11.3.2 содержит инструкцию sleep, которая восполняет собой отсутствие реальной синхронизации.
Программа 11.3.2 считывает данные из FIFO-структуры channel. 1 и записывает информацию в FIFO-структуру channel. 2.
// Программа 11.3.2. Считывание данных из FIFO-структуры
// channel.l и запись информации в
// FIFO-структурУ channel.2
10 using namespace std; 11
12 class multiplier{
13 double X,-
14 public:
15 multiplier(double Value) { X = Value;}
16 double &operator(double Y) { X = (X * Y);return(X);}
17 }; 18
19
20 int main(int argc,char *argv[])
21 { 22
23 double Size;
24 double Data;
25 vector<double> 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<double> 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.2
Имя программы
programll-3b.ee
Описание
Программа считывает объекты из FIFO-структуры с помощью объекта типа ifstream. Для пересылки данных через FIFO-структуру здесь используется итератор типа ostream_iterator и стандартный алгоритм transform.
Требуемые заголовки
><unistd.h>, <iomanip>, <algorithm>, <fstream.h>, <vector>, <iterator>, <strstream.h>, <stdlib.h>, <sys/wait.h>, <sys/types.h>, <sys/stat.h>, ^<fcntl .h>, <numeric>.
Инструкции по компиляции и компоновке программ
с++ -о 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, которая восполняет собой отсутствие реальной синхронизации.
Интерфейсные FIFO-классы
Упростить межпроцессное взаимодействие (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-механизма. Более того, «классовый» подход создает условия для обеспечения типовой безопасности и вообще позволяет программисту работать на более высоком уровне.