Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпори СПОС.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
145.46 Кб
Скачать
  1. Командний сценарій. Потоки введення/виведення, конвеєри.

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

Стандартне введення

Потік номер 0 (stdin) зарезервовано для читання команд користувача або вхідних даних.

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

Стандартне виведення

Потік номер 1 (stdout) зарезервовано для виведення даних, як правило (хоча і не обов'язково) текстових.

При інтерактивному запуску програми stdout за замовчуванням націлений на запис на пристрій виведення (монітор). Командна оболонка UNIX (і оболонки інших систем) дозволяють скерувати цей потік за допомогою символу «>». Для виконання програм у фоновому режимі цей потік зазвичай переводять у файл.

В Юнікс-подібних операційних системах, конвеєри відповідають оригінальним конвеєрам програм: набір процесів, зв'язані своїми стандартними потоками вводу-виводу таким чином, що вихідний потік кожного процесу (stdout) безпосередньо зв'язується зі стандартним потоком вводу (stdin) наступного. Кожний зв'язок реалізується як анонімний конвеєр. Програми-фільтри часто використовуються в подібнх комбінаціях. Цю концепцію було запропоновано Дугласом Мак-Ілроєм для оболонок Юнікс і дано назву за аналогією зі справжніми конвеєрами.

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

  1. Приклади застосування операторів перенаправлення введення/виведення та конвеєрів.

    Однією з найкорисніших фундаментальних властивостей Unix (у тому числі й Linux) є конвеєри. Конвеєри уможливлюють зв'язок між процесами, котрі не призначались спеціально для такої взаємодії. А це дозволяє знаряддям з досить вузьким колом функцій комбінуватись у різні способи для виконання складніших завдань.

Простий приклад використання конвеєра:

ls | grep x

Оболонка bash, перевіряючи командний рядок, знаходить вертикальну риску |, що розділює дві команди, після чого, як і інші оболонки, запускає обидві команди, під'єднуючи вивід першої команди до вводу другої. Програма ls видає список файлів у поточному каталозі, тоді як grep читає вивід ls й видруковує лише ті лінії, які містять x.

Наведений приклад, відомий більшості користувачів Unix, є так званим "неназваним конвеєром". Такий конвеєр існує лише в ядрі й недоступний для процесів, що його створили — в даному випадку це оболонка bash. Кому невідомо: головний процес — це перший процес, створений програмою. Він може, в свою чергу, створювати підпроцеси.

Перенаправлення потоків введення-виведення здійснюється, подібно DOS за допомогою символів:

> - перенаправлення стандартного потоку виводу >> - перенаправлення стандартного потоку виводу у режимі записування < - перенаправлення стандартного потоку вводу << - отримання дані зі стандартного потоку вводу до тих пір, поки не зустрінеться розділювач Однак, на відміну від DOS при створенні програмного каналу між двома процесами в ОС UNIX/Linux запускає обидва процесу одночасно і здійснює передачу інформації через системний буфер (без проміжної запису на диск). Таким чином, програмні канали в ОС UNIX/Linux є дуже ефективним способом обміну. У разі ппереполнения системного буфера (наприклад, якщо `передавальна"" програма видає інформацію в канал швидше, ніж її може обробити `приймаюча"" програма) ОС автоматично припиняє той процес, який здійснює запис у канал до звільнення буфера.