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

У всіх прикладах попереднього розділу застосовувався один і той же прийом: приміщення виведення однієї програми на вхід іншої через тимчасовий файл Але ж у тимчасового файлу немає іншого призначення на самому ділі це занадто грубий метод Дане спостереження привело до створення концепції програмного каналу (pipe), Одного з найбільш важливих досягнень системи UNIX Канал – це спосіб підключення виводу однієї програми на вхід іншої без яких би то не було тимчасових файлів а конвеєр (pipeline) – Це зєднання двох або більше програм допомогою каналів

Давайте звернемося до прикладів, розглянутим раніше, і використовуємо канали замість тимчасових файлів Символ вертикальної риси | повідомляє оболонці, що треба утворити конвеєр:

$ who | sort Друкує відсортований список користувачів

$ who | wc-l Вважає кількість користувачів

$ ls | wc-l Вважає кількість файлів

$ ls | pr -3 Виводить імена файлів в 3 колонки

$ who | grep mary Шукає зазначеного користувача

Будь-яка програма, яка читає з терміналу, може читати замість цього з каналу будь-яка програма, яка виводить дані на термінал, може виводити їх в канал Саме в цій ситуації угоду про те, що якщо програмі не вказані імена файлів, то вона читає стандартний ввід, окупається в повній мірі: всі програми, що дотримують цю угоду, можуть бути включені в конвеєри У прикладах, розглянутих вище, команди grep, pr, sort і wc використовуються в конвеєрах саме таким чином

У конвеєр можна включити будь-яку кількість програм:

$ ls | pr  -3  | lpr

створює список файлів в 3 колонки на построчно друкувальному принтері, а

$ who  | grep  mary | wc -l

підраховує, скільки разів Мері зареєстрована в системі

Насправді всі програми конвеєра виконуються одночасно, а не одна за одною Це означає, що програма конвеєра може бути і інтерактивної ядро стежить за тим, як правильно забезпечити синхронізацію і диспетчеризацію, щоб все працювало

Як ви, напевно, вже здогадуєтеся, створенням каналів займається оболонка окремі програми не мають поняття про перенаправлення вводу-виводу Звичайно, для того щоб мати можливість спільної роботи, програми повинні дотримуватися певних угод Більшість команд має однаковий дизайн, так що вони підходять для будь-якої позиції в конвеєрі Зазвичай виклик програми виглядає наступним чином:

команда необязательние5аргументи необязательные5имена5файлов

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

А ось повідомлення про помилки виконання команд повинні оброблятися по-іншому, інакше вони можуть зникнути в файлі або каналі Тому у кожної команди є ще і стандартний висновок помилок, який зазвичай направляється на термінал Схема на рис 12 ілюструє весь процес

Практично всі команди, описані раніше, працюють по цій моделі виняток становлять такі команди, як date і who, які не читають вхідні дані, і кілька команд типу cmp і diff, у кото яких фіксована кількість вхідних файлів (Але зверніть увагу на параметр «-» у цих командах)

Рис 12 Обробка повідомлень про помилки

Вправа 17 Поясніть, у чому полягає відмінність між

$ who  | sort

і

$ who  &gtsort

~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*