Програмні канали

Одним з «фірмових» винаходів UNIX, згодом запозичених іншими ОС, є поняття програмного каналу або «трубопроводу» (pipe), що дозволяє виконувати обмін даними між процесами за допомогою тих же системних викликів, які використовуються для читання / запису даних при роботі з файлами і з периферійними пристроями.

Програмні канали можуть бути безіменними або іменованими. Для створення безіменного каналу процес повинен використовувати системний виклик pipe, яка повертає масив з двох елементів, що

містять хендл для читання з каналу і хендл для запису в канал. Після цього для роботи з каналом можна використовувати звичайні функції читання з файлу і запису у файл, вказуючи відповідні хендл каналу. Як правило, процес, який створив канал, потім породжує двох нащадків, з яких один буде виконувати запис в канал, а інший - читання (нагадаємо, що при створенні процесу він отримує копії всіх хендл, відкритих батьком). Не виключена також можливість використання каналу декількома процесами, кожен з яких може, в принципі, як записувати, так і читати дані.

Дані, записувані в канал, буферизуются системою в пам'яті і потім можуть бути прочитані функціями читання з каналу. Якщо в каналі немає даних, то функція читання блокує викликав її процес, поки інший процес не запише дані в канал.

Якщо всі процеси закрили хендл записи в канал (тобто, немає шансів, що в канал будуть поміщені ще які-небудь дані), то процес-читач, вибравши всі дані, які ще залишалися в каналі, прочитає потім ознака кінця файлу.

Гірше, якщо закриті всі хендл читання, а який-небудь процес намагається виконати запис даних, які нікому буде прочитати. У цьому випадку система посилає процесу сигнал про помилку роботи з каналом.

Використання безіменних каналів має одне обмеження: всі процеси, що працюють з каналом, повинні бути нащадками процесу, який створив канал. Для передачі даних між неспорідненими процесами можна використовувати іменовані канали, звані також каналами FIFO. Такий канал створюється системним викликом mknod, при цьому вказується шлях і ім'я каналу, як при створенні файлу. Імена каналів зберігаються в каталогах файлової системи UNIX нарівні з іменами звичайних і спеціальних файлів. Щоб відкрити канал для читання або для запису, використовується звичайний системний виклик open із зазначенням необхідного режиму доступу, як при відкритті файлу.