Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 304

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

>14 using namespace std;

>15

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

>17

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

>19 {

>20

>21 int Pid,Status,Size;

>22 double Value;

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

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

>28 vector X(100,13.0);

>29 vector Y;

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

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

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

>33 ostream_iterator 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 }

>42

>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;

>48

>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() или создать новые объекты типа