Конвеєр (pipe- програмний канал (зв'язку), або, як його іноді називають, транспортер) є засобом, за допомогою якого можна виробляти про-мен даними між процесами. Принцип роботи конвеєра заснований на меха-низме введення / виведення, який використовується для роботи з файлами вUNIX, тобто завдання, що передає інформацію, діє так, як ніби вона записує дані в файл, в той час як завдання, для якої призначається ця інфор мація, читає її з цього файлу. Операції запису і читання здійснюються не записами, як це робиться в звичайних файлах, а потоком байтів, як це було прийнято в UNIX-системах. Таким чином, функції, за допомогою яких ви-виконується запис в канал і читання з нього, є тими ж самими, що і при роботі з файлами. По суті, канал представляє собою потік даних між дво-ма (або більше) процесами. Це спрощує програмування і позбавляє про-граммістов від використання якихось нових механізмів. Насправді конвеєри не є файлами на диску, а являють собою буферну пам'ять, що працює по прінціпуFIFO, тобто за принципом звичайної черги. Однак не слід плутати конвеєри з чергами повідомлень; останні реалізуються інакше і мають можливість вибрати.
Конвеєр має певний розмір 1. який не може перевищувати 64 Кбайт, і працює циклічно. Згадайте реалізацію черзі на масивах, коли име-ються покажчики початку і кінця черги, які переміщуються циклічно по масиву. Є якийсь масив і два покажчика: один показує на перший елемент (назвемо його умовно, head), а другий - на останній (назвемо егоtail).
У початковий момент обидва покажчика дорівнюють нулю. Додавання самого першого еле-мента в порожню чергу призводить до того, що покажчики headіtailпрінімают значення, рівне 1 (в масиві з'являється перший елемент). В подальшому додавання нового елемента викликає зміна значення другого покажчика, оскільки він відзначає розташування саме останнього елемента черги. Читання (і видалення) елемента (читається і видаляється завжди перший елемент з створений-ної черзі) призводить до необхідності модифікувати значення указателяhead. В результаті операцій записи (додавання) і читання (видалення) елементів в масиві, моделирующем чергу елементів, покажчики будуть переміщатися від початку масиву до його кінця. При досягненні покажчиком значення індексу останнього елемента масиву значення покажчика знову стає одиничним (якщо при цьому не сталося переповнення масиву, тобто кількість елементів в черги не стало більше числа елементів в масиві). Можна сказати, що ми як би замикаємо масив в кільце, організовуючи круговий рух указателейheadіtail, які відстежують перший і останній елементи в черзі. Ска-занное проілюстровано на рис. 6.5. Саме так і функціонує конвеєр.
Мал. 6.5. Організація черги на масиві
Як інформаційна структура канал описується ідентифікатором, розміром і двома покажчиками. Конвеєри є системний ресурс. Щоб почати роботу з конвеєром, процес спочатку повинен замовити його у операційної системи і отримати в своє розпорядження. Процеси, які знають иденти-фікатор конвеєра, можуть через нього обмінюватися даними.
Тепер розглянемо основні системні запити для роботи з ними. Як приклад візьмемо виклики з APIOS / 2 (в наступному розділі ми ними скористається-емся). Традиційні виклики для роботи з каналами (конвеєрами) наведені в розділі, де описується архітектура сістемиUNIX (див. Розділ 8). Отже:
Функція створення конвеєра:
DosCreatePipe (ReadHand1e, WriteHandle, PipeSize);
де ReadHandle- описатель для читання з конвеєра, WriteHandle- описатель для запису в конвеєр, PipeSize- розмір конвеєра.
Функція читання з конвеєра:
DosRead (ReadHandle, (PVOID) Inform, sizeof (Inform), BytesRead);
Функція запису в конвеєр:
DosWrite (WriteHand1e, (PVOID) Inform, s1zeof (Inform), BytesWrite);
де WriteHandle - описувач для запису в конвеєр, BytesWrite- кількість записаних байтів.
Читати з конвеєра може тільки той процес, який знає ідентифікатор відповідного конвеєра. При роботі з конвеєром дані безпосередньо поміщаються в нього. Ще раз відзначимо, що через обмеження на розмір конвеєр-ра програмісти стикаються і з обмеженнями на розміри переданих че-рез нього повідомлень.