
- •1.1. Поняття операційної системи, її призначення та функції
- •1.1.1. Поняття операційної системи
- •1.1.2. Призначення операційної системи
- •1.1.3. Операційна система як розширена машина
- •1.1.4. Операційна система як розподілювач ресурсів
- •1.2. Історія розвитку операційних систем
- •1.3. Класифікація сучасних операційних систем
- •1.4. Функціональні компоненти операційних систем
- •1.4.1. Керування процесами й потоками
- •1.4.2. Керування пам'яттю
- •1.4.3. Керування введенням-виведенням
- •1.4.4. Керування файлами та файлові системи
- •1.4.5. Мережна підтримка
- •1.4.6. Безпека даних
- •1.4.7. Інтерфейс користувача
- •2.1. Базові поняття архітектури операційних систем
- •2.1.1. Механізми і політика
- •2.1.2. Ядро системи. Привілейований режим і
- •2.2. Реалізація архітектури операційних систем
- •2.2.1. Монолітні системи
- •2.2.2. Багаторівневі системи
- •2.2.3. Системи з мікроядром
- •2.2.4. Концепція віртуальних машин
- •2.3.1. Взаємодія ос і апаратного забезпечення
- •2.3.2. Взаємодія ос і виконуваного програмного коду
- •2.4.1. Базова архітектура unix
- •2.4.2. Архітектура Linux
- •2.5. Особливості архітектури: Windows хр
- •2.5.1. Компоненти режиму ядра
- •2.5.2. Компоненти режиму користувача
- •2.5.3. Об'єктна архітектура Windows хр
- •3.1. Базові поняття процесів і потоків
- •3.1.1. Процеси і потоки в сучасних ос
- •3.1.2. Моделі процесів і потоків
- •3.1.3. Складові елементи процесів і потоків
- •3.2. Багатопотоковість та її реалізація
- •3.2.1. Поняття паралелізму
- •3.2.2. Види паралелізму
- •3.2.3. Переваги і недоліки багатопотоковості
- •3.2.4. Способи реалізації моделі потоків
- •3.3. Стани процесів і потоків
- •3.4. Опис процесів і потоків
- •3.4.1. Керуючі блоки процесів і потоків
- •3.4.2. Образи процесу і потоку
- •3.5. Перемикання контексту й обробка переривань
- •3.5.1. Організація перемикання контексту
- •3.5.2. Обробка переривань
- •3.6. Створення і завершення процесів і потоків
- •3.6.1.Створення процесів
- •3.6.2.Ієрархія процесів
- •3.6.3.Керування адресним простором під час створення процесів
- •3.6.4. Особливості завершення процесів
- •3.6.5. Синхронне й асинхронне виконання процесів
- •3.6.6. Створення і завершення потоків
- •4.1. Загальні принципи планування
- •4.1.1. Особливості виконання потоків
- •4.1.2. Механізми і політика планування
- •4.1.3. Застосовність принципів планування
- •4.2. Види планування
- •4.2.1. Довготермінове планування
- •4.2.2. Середньотермінове планування
- •4.2.3. Короткотермінове планування
- •4.3. Стратегії планування. Витісняльна і невитісняльна багатозадачність
- •4.4. Алгоритми планування
- •4.4.1. Планування за принципом fifo
- •4.4.2. Кругове планування
- •4.4.3. Планування із пріоритетами
- •4.4.4. Планування на підставі характеристик подальшого виконання
- •4.4.5. Багаторівневі черги зі зворотним зв'язком
- •4.4.6. Лотерейне планування
- •4.5. Реалізація планування в Linux
- •4.5.1. Планування процесів реального часу в ядрі
- •6.1. Види міжпроцесової взаємодії
- •6.1.1.Методи розподілюваної пам'яті
- •6.1.2.Методи передавання повідомлень
- •6.1.3.Технологія відображуваної пам'яті
- •6.1.4.Особливості міжпроцесової взаємодії
- •6.2. Базові механізми міжпроцесової взаємодії
- •6.2.1. Міжпроцесова взаємодія на базі спільної пам'яті
- •6.2.2. Основи передавання повідомлень
- •6.2.3. Технології передавання повідомлень
- •8.1. Основи технології віртуальної пам'яті
- •8.1.1. Поняття віртуальної пам'яті
- •8.1.2. Проблеми реалізації віртуальної пам'яті. Фрагментація пам'яті
- •8.1.4. Підхід базового і межового регістрів
- •8.2. Сегментація пам'яті
- •8.2.1. Особливості сегментації пам'яті
- •8.2.2. Реалізація сегментації в архітектурі іа-32
- •8.3. Сторінкова організація пам'яті
- •8.3.1. Базові принципи сторінкової організації пам'яті
- •8.3.2. Порівняльний аналіз сторінкової організації пам'яті та сегментації
- •8.3.3. Багаторівневі таблиці сторінок
- •8.3.4. Реалізація таблиць сторінок в архітектурі іа-32
- •8.3.5. Асоціативна пам'ять
- •8.4. Сторінково-сегментна організація пам'яті
- •8.5. Реалізація керування основною пам'яттю: Linux
- •8.5.1. Використання сегментації в Linux. Формування логічних адрес
- •8.5.2. Сторінкова адресація в Linux
- •8.5.3. Розташування ядра у фізичній пам'яті
- •8.5.4.Особливості адресації процесів і ядра
- •8.5.5.Використання асоціативної пам'яті
- •8.6. Реалізація керування основною пам'яттю: Windows хр
- •8.6.1.Сегментація у Windows хр
- •8.6.2.Сторінкова адресація у Windows хр
- •8.6.3.Особливості адресації процесів і ядра
- •8.6.4. Структура адресного простору процесів і ядра
- •11.1. Поняття файла і файлової системи
- •11.1.1. Поняття файла
- •11.1.2.Поняття файлової системи
- •11.1.3.Типи файлів
- •11.1.4. Імена файлів
- •11.2. Організація інформації у файловій системі
- •11.2.1. Розділи
- •11.2.2. Каталоги
- •11.2.3. Зв'язок розділів і структури каталогів
- •11.3. Зв'язки
- •11.3.1. Жорсткі зв'язки
- •11.3.2. Символічні зв'язки
- •11.4. Атрибути файлів
- •11.5. Операції над файлами і каталогами
- •11.5.1. Підходи до використання файлів процесами
- •12.1. Базові відомості про дискові пристрої
- •12.1.1. Принцип дії жорсткого диска
- •12.1.2. Ефективність операцій доступу до диска
- •12.2. Розміщення інформації у файлових системах
- •12.2.1. Фізична організація розділів на диску
- •12.2.2. Основні вимоги до фізичної організації файлових систем
- •12.2.3. Неперервне розміщення файлів
- •12.2.4. Розміщення файлів зв'язними списками
- •12.2.5. Індексоване розміщення файлів
- •12.2.6. Організація каталогів
- •15.1. Завдання підсистеми введення-виведення
- •15.1.1. Забезпечення ефективності доступу до пристроїв
- •15.1.2. Забезпечення спільного використання зовнішніх пристроїв
- •15.1.3. Універсальність інтерфейсу прикладного програмування
- •15.1.4. Універсальність інтерфейсу драйверів пристроїв
- •15.2. Організація підсистеми введення-виведення
- •15.2.1. Символьні, блокові та мережні драйвери пристроїв
- •15.2.2. Відокремлення механізму від політики за допомогою
- •15.3. Способи виконання операцій введення-виведення
- •15.3.1. Опитування пристроїв
- •15.3.2. Введення-виведення, кероване перериваннями
- •15.3.3. Прямий доступ до пам'яті
- •15.4. Підсистема введення-виведення ядра
- •15.4.1. Планування операцій введення-виведення
- •15.4.2. Буферизація
- •15.7. Керування введенням-виведенням: unix і Linux
- •15.7.1. Інтерфейс файлової системи
- •15.7.2. Передавання параметрів драйверу
- •15.7.3. Структура драйвера
- •15.7.4. Виконання операції введення-виведення для пристрою
- •15.8. Керування введенням-виведенням: Windows хр
- •15.8.1. Основні компоненти підсистеми введення-виведення
- •15.8.2. Виконання операції введення-виведення для пристрою
- •15.8.3. Передавання параметрів драйверу пристрою
- •17.1. Термінальне введення-виведення
- •17.1.1. Організація термінального введення-виведення
- •17.1.3. Термінальне введення-виведення у Win32 api
- •17.2. Командний інтерфейс користувача 17.2.1.
- •17.2.2. Переспрямування потоків введення-виведення
- •17.2.3. Використання каналів
- •17.3. Графічний інтерфейс користувача
- •17.3.1. Інтерфейс віконної та графічної підсистеми Windows хр
- •17.3.2. Система X Window
- •17.4. Процеси без взаємодії із користувачем
- •17.4.1. Фонові процеси на основі posix
- •17.4.2. Служби Windows хр
- •16.1. Загальні принципи мережної підтримки
- •16.1.1. Рівні мережної архітектури і мережні сервіси
- •16.1.2. Мережні протоколи
- •16.2. Реалізація стека протоколів Інтернету
- •16.2.1. Рівні мережної архітектури tcp/ip
- •16.2.2. Канальний рівень
- •16.2.3. Мережний рівень
- •16.2.4. Транспортний рівень
- •16.2.5. Передавання даних стеком протоколів Інтернету
- •16.3. Система імен dns
- •16.3.1. Загальна характеристика dns
- •16.3.2. Простір імен dns
- •16.3.3. Розподіл відповідальності
- •16.3.4. Отримання ір-адрес
- •16.3.5. Кешування ір-адрес
- •16.3.6. Типи dns-ресурсів
- •16.4. Програмний інтерфейс сокетів Берклі
- •16.4.1. Особливості роботи з адресами
- •16.4.2. Створення сокетів
- •16.4.3. Робота з потоковими сонетами
- •16.4.4. Введення-виведення з повідомленням
- •19.1. Загальні принципи завантаження ос
- •19.1.1. Апаратна ініціалізація комп'ютера
- •19.1.2. Завантажувач ос
- •19.1.3. Двоетапне завантаження
- •19.1.4. Завантаження та ініціалізація ядра
- •19.1.5. Завантаження компонентів системи
- •19.2. Завантаження Linux
- •19.2.1. Особливості завантажувача Linux
- •19.2.2. Ініціалізація ядра
- •19.2.3. Виконання процесу init
- •19.3. Завантаження Windows хр
- •20.1. Багатопроцесорні системи
- •20.1.1. Типи багатопроцесорних систем
- •20.1.2. Підтримка багатопроцесорності в операційних системах
- •20.1.3. Продуктивність багатопроцесорних систем
- •20.1.4. Планування у багатопроцесорних системах
- •20.1.5. Спорідненість процесора
- •20.1.6. Підтримка багатопроцесорності в Linux
- •20.1.7. Підтримка багатопроцесорності у Windows хр
- •20.2. Принципи розробки розподілених систем
- •20.2.1. Віддалені виклики процедур
- •20.2.2. Використання Sun rpc
- •20.2.3. Використання Microsoft rpc
- •20.2.4. Обробка помилок і координація в розподілених системах
- •20.3. Розподілені файлові системи
- •20.3.1. Організація розподілених файлових систем
- •20.3.2. Файлова система nfs
- •20.3.3. Файлова система Microsoft dfs
- •20.4. Сучасні архітектури розподілених систем
- •20.4.1. Кластеры системи
- •20.4.2. Grid-системи
- •18.1. Основні завдання забезпечення безпеки
- •18.2. Базові поняття криптографії
- •18.2.1. Поняття криптографічного алгоритму і протоколу
- •18.2.2. Криптосистеми з секретним ключем
- •18.2.3. Криптосистеми із відкритим ключем
- •18.2.4. Гібридні криптосистеми
- •18.2.5. Цифрові підписи
- •18.2.6. Сертифікати
- •18.3. Принципи аутентифікаціїі керування доступом
- •18.3.1. Основи аутентифікації
- •18.3.2. Основи керування доступом
- •18.4. Аутентифікація та керування доступом в unix
- •18.4.1. Облікові записи користувачів
- •18.4.2. Аутентифікація
- •18.4.3. Керування доступом
- •18.5. Аутентифікація і керування доступом у Windows xp
- •18.5.1. Загальна архітектура безпеки
- •18.5.2. Аутентифікація
- •18.5.3. Керування доступом
- •18.6. Аудит
- •18.6.1. Загальні принципи організації аудиту
- •18.6.2. Робота із системним журналом unix
- •18.6.3. Журнал подій Windows xp
- •18.7. Локальна безпека даних
- •18.7.1. Принципи шифрування даних на файлових системах
- •18.7.2. Підтримка шифрувальних файлових систем у Linux
- •18.7.3. Шифрувальна файлова система Windows xp
- •18.8. Мережна безпека даних
- •18.8.1. Шифрування каналів зв'язку
- •18.8.2. Захист інформації на мережному рівні
- •18.8.3. Захист інформації на транспортному рівні
- •18.9. Атаки і боротьба з ними
- •18.9.1. Переповнення буфера
- •18.9.2. Відмова від обслуговування
- •18.9.3. Квоти дискового простору
- •18.9.4. Зміна кореневого каталогу застосування
17.1. Термінальне введення-виведення
У цьому розділі зупинимося на базовій технології для організації взаємодії із користувачем в операційних системах — термінальному введенні-виведенні. Хоч історія цієї технології нараховує кілька десятиліть, проте вона продовжує залишатися важливою складовою сучасних ОС.
17.1.1. Організація термінального введення-виведення
Спочатку розглянемо принципи організації термінального введення-виведення, що не залежать від конкретної ОС [44].
Поняття термінала
Історично термінали (terminals) використовували для організації багатокористу-вацької роботи із мейнфреймами або мінікомп'ютерами. Це були апаратні пристрої, що складалися із клавіатури і дисплея, які підключали до комп'ютера через інтерфейс послідовного порту. Особливе поширення такі термінали здобули у 70-80-ті роки: усі розроблені в той час операційні системи включали засоби їхньої підтримки, було створено багато прикладного програмного забезпечення, розрахованого на роботу із ними.
Такі термінали працюють у текстовому режимі, за якого обмін даними і їхнє відображення на програмному рівні відбуваються посимвольно. Для відображення використовують екран розміром у символах (звичайно 25 на 80), причому відображатися можуть тільки стандартні символи із кодами ASCII. За подання на екрані розширеного набору символів із кодами 127-255, зокрема символів кирилиці, відповідає символьна таблиця, яка використовується терміналом.
Є спеціальні символи (керуючі коди) і послідовності символів, які не відображаються, а керують виведенням на екран термінала. До керуючих кодів належать такі символи, як повернення каретки, переведення рядка, Backspace тощо. Керуючі послідовності називають також £5С-послідовностями (вони починаються із символу із ASCII-кодом 27 — ESC). Передаючи такі послідовності термінала, можна переміщати курсор у довільну позицію екрана, керувати яскравістю відображення символів, для деяких моделей терміналів - кольорами тощо.
Емуляція термінала
У сучасних умовах апаратні термінали застосовують рідко. Проте інтерфейс зв'язку з терміналами (термінальне введення-виведення) не втратив свого значення й досі. Це пояснюється тим, що текстовий режим роботи дуже зручний для розв'язання багатьох задач (організації адміністрування системи, віддаленого доступу до неї тощо), а також широким вибором програмного забезпечення, яке використовує цей режим.
Для спрощення організації термінального введення-виведення у сучасних ОС широко використовують емуляцію термінала. Програмне забезпечення (емулятор) приймає дані згідно із домовленостями щодо обміну із відповідним терміналом і відображає на дисплеї комп'ютера інформацію згідно керуючих послідовностей, визначених для термінала (для цього може бути виділене окреме вікно на графічному екрані). У результаті програмне забезпечення, розраховане на роботу із терміналом, можна використовувати із таким емулятором без змін. Одночасно у системі може бути запущено кілька емуляторів термінала (наприклад, кожен у своєму вікні), і користувач має змогу перемикатися між ними, чергово виконуючи введення-виведення. Найпоширеніша емуляція термінала vtlOO, програмне забезпечення, розраховане на використання цього термінала, із великою ймовірністю працюватиме із будь-яким емулятором.
Надалі говоритимемо про введення із термінала і виведення на термінал, не уточнюючи, що обмін даними майже завжди відбуватиметься не з апаратним терміналом, а з його емулятором.
Віддалені термінали і консоль
Емулятор термінала може бути запущений на віддаленому комп'ютері, при цьому необхідно забезпечити обмін даними мережею між ним і програмним забезпеченням. Прикладом розв'язання такої задачі є протокол telnet, який працює поверх TCP/IP. Відповідний сервер (telnet-сервер) запускають на машині, яка надає віддалений доступ. Він перехоплює дані, що їх застосування передають на термінал, і пересилає їх на віддалену систему. Там працює емулятор термінала (telnet-клієнт), який інтерпретує отримані дані й, у свою чергу, відсилає серверу інформацію, введену на віддаленій машині. Сервер доставляє її застосуванням.
З іншого боку, якщо дисплей комп'ютера, на якому запущена ОС, працює у текстовому режимі, за відображення інформації на ньому теж може відповідати емулятор термінала. У багатокористувацьких ОС із мережним доступом (наприклад, в UNIX) такий термінал часто називають консоллю, на відміну від терміналів, які використовують для доступу до системи через мережу.
Термінальне введення
Є два підходи до організації термінального введення.
♦ У режимі без обробки, або неканонічному режимі (non-canonical mode), дані передають програмі без зміни (включаючи керуючі коди, такі, як переведення каретки або Backspace). За інтерпретацію цих кодів відповідає програма. Такий режим складніший у використанні (потрібно інтерпретувати керуючі коди), але більш гнучкий. Найчастіше його використовують текстові редактори.
▼ У разі використання режиму з обробкою, або канонічного режиму (canonical mode), дані додатково оброблятимуться перед тим як надійти у програму. Така обробка відбувається після натискання користувачем клавіші Enter (введення символу переведення рядка), при цьому керуючі коди буде інтерпретовано і відповідно до них змінено весь уведений рядок (наприклад, якщо в ньому тричі поспіль трапиться Backspace, ці три символи і ще три, введені перед ними, із рядка будуть вилучені). Такий режим простіший для програміста, у програму в даному разі потрапляє вже підготовлений символьний рядок. Прикладом програмного забезпечення, що реалізує компроміс між цими режимами, може бути розповсюджена в UNIX-системах бібліотека readline. Вона надає розширені засоби редагування введеного рядка, які потребують підтримки неканонічного режиму, але її програмний інтерфейс аналогічний до введення в канонічному режимі (у програму потрапляє підготовлений внаслідок редагування рядок).
Введені із клавіатури символи зберігаються у буфері, навіть у неканонічному режимі (трапляються ситуації, коли застосування не може відразу прийняти дані від клавіатури, і потрібно зберегти їх до того моменту, коли з'явиться така можливість). У канонічному режимі дані із буфера передаються програмі після введення символу переведення рядка, у неканонічному — як тільки програма буде готова їх прийняти. Звичайно для кожного термінала створюється свій окремий буфер введення. У разі заповнення буфера може бути виділена додаткова пам'ять.
У більшості випадків уведені символи відразу відображаються на екрані (робота в режимі луни). Можливе відключення цього режиму, наприклад під час введення паролів або команд текстових редакторів.
Термінальне виведення
Для виведення на термінал теж використовують буферизацію. Буфер виводу заповнюють у тому випадку, коли термінал не готовий прийняти символ; у міру його готовності символи із буфера передають терміналу. Відображаючи дані, він інтерпретує керуючі послідовності, після чого показує інформацію, виділяє кольорами окремі ділянки, переміщає курсор тощо.
Головна проблема полягає в тому, що різні модифікації терміналів сприймають різні набори послідовностей. Для її вирішення у сучасних ОС звичайно створюють базу даних терміналів, що містить список терміналів і послідовності, які відповідають кожному із них. В UNIX-системах таку базу називають ternrinfo.
Логічна структура термінального введення-виведення показана на рис. 17.
Термінальне введення-виведення в UNIX та Linux
Тут розглянемо особливості реалізації та використання термінального введення-виведення в UNIX-системах на прикладі Linux.
Файли термінальних пристроїв і консоль
Кожному терміналу в Linux (як і в інших UNIX-системах) відповідає файл символьного пристрою. Наприклад, файли /dev/ttyn (п = 1, 2.....63) відповідають терміналам віртуальної консолі (доступний набір таких терміналів, що дає можливість відкривати кілька паралельних сесій користувача; для перемикання між віртуальними консолями використовують комбінації клавіш Ctrl+Fn), файли /dev/ttySn -терміналам, пов'язаним із з'єднаннями через послідовний порт. Відкривши такий файл, можна працювати із відповідним терміналом.
tty2 = open("/dev/tty2". 0RDWR. 0644);
write(tty2, "Виведення на другу віртуальну консоль\n". ...);
Консоль Linux емулює спеціальний вид термінала, який називають Linux. Він надає доволі широкі можливості щодо керування відображенням інформації (підтримку кольору, керуючих клавіш, перевизначення символьної таблиці «на ходу»). Поточну консоль відображають файлом /dev/console.
Псевдотермінали
Раніше вже йшлося про принцип роботи протоколу telnet. Виникає запитання: яким чином telnet-сервер перехоплює дані, що їх застосування відсилають на термінал? Для відповіді потрібно ознайомитися із концепцією псевдотперміналів.
Псевдотерміналом (pty) називають спеціальний пристрій, який створює і контролює процес режиму користувача (ведучий процес, pty master). Для всіх інших процесів (ведених процесів, pty slaves) цей пристрій має вигляд реального термінала. У результаті всі дані, якими ведені процеси обмінюються із псевдотерміналом, опиняються під повним контролем ведучого процесу. Зокрема, ведучим процесом у разі telnet є telnet-сервер, веденим - процес, який запускають у telnet-сесії. У результаті сервер має змогу перехоплювати всі дані, які будуть згене-ровані під час сесії, та відсилати їх мережею.
Псевдотермінал відображають двома спеціальними файлами пристроїв: файлом ведучого (pty master file) і файлом веденого (pty slave file). Із файлом ведучого працює ведучий процес, усі інші процеси працюють із файлом веденого. Усі дані, записані у файл веденого, можуть бути зчитані із файла ведучого і навпаки. У Linux є різні домовленості на імена для цих файлів, наприклад, файли ведучого можуть бути згенеровані за запитом у каталозі /dev/pts.
Є кілька цікавих застосувань псевдотерміналів. Так, є утиліта screen, що перехоплює весь ввід-вивід інтерактивної програми або сесії користувача і зберігає його у файлі. Для цього screen створює псевдотермінал і змушує програму обмінюватися даними не із консоллю, а із цим терміналом.
Керуючий термінал процесу
Процес в UNIX-системі може мати керуючий термінал (controlling terminal), з якого отримуватиме сигнали від клавіатури (SIGINT у разі натискання користувачем Ctrl+C, SIGQUIT - Ctri-D). Звичайно це термінал, із якого ввійшов у систему користувач, що створив такий процес. Для процесу доступний файл /dev/tty, що відповідає цьому терміналу. Далі в розділі ознайомимося із деякими додатковими особливостями взаємодії між процесами і керуючими терміналами.
Наперед визначені файлові дескриптори
Відкривати щоразу файл керуючого термінала під час введення-виведення не дуже зручно. Розглянемо засоби, які надають ОС для спрощення роботи із таким терміналом.
Під час створення нового процесу у його таблиці файлових дескрипторів fd заздалегідь створюють три елементи, котрі використовують як наперед визначені файлові дескриптори. Вони відповідають трьом заздалегідь відкритим файлам, доступним для кожного процесу і за замовчуванням пов'язаних із керуючим терміналом користувача, що створив цей процес:
♦ stdin - файл стандартного вводу (йому відповідає дескриптор fd[0]);
♦ stdout - файл стандартного виводу (йому відповідає fd[l]);
♦ stderr - файл повідомлень про помилки (йому відповідає fd[2]).
Виклик writed. ...) або write(2. ...) означає виведення на відповідний термінал, read(0. ...) - введення із клавіатури, пов'язаної із цим терміналом. Таку концепцію сьогодні використовують і в інших ОС, які підтримують термінальне введення-виведення. Для можливості перенесення, замість чисел 0, 1 і 2, рекомендують вживати константи STDINFILENO, STD0UTJILEN0 і STDERRFILENO:
int bytes_read; char buf[1024]:
// зчитати дані з файла стандартного вводу
bytes_read = read(STDIN_FILENO. buf. sizeof(buf));
// вивести їх же у файл стандартного виводу
wrіte(STDOUT_FILENO. buf. Bytes_read):
Є багато прикладних і системних програм, які розраховані на отримання даних з файла стандартного вводу і відображення результатів у файл стандартного виводу. Такі програми називають фільтрами. Серед найвідоміших фільтрів можна виділити sort (сортування файла стандартного вводу, записування результату на стандартний вивід) і дгер (пошук заданого підрядка у стандартному вводі, записування рядків, де знайдено цей підрядок, на стандартний вивід).
Програмне керування терміналом
Стандарт POSIX визначає набір системних викликів для керування режимами роботи із терміналом. Для задания атрибутів режиму термінального введення-виведення використовують системний виклик tcsetattrO, а для отримання поточних атрибутів режиму - tcgetattrO. Обидва ці виклики приймають параметром покажчик на структуру termi os, яка містить зокрема поле с_1 f 1 ag — маску прапорців режимів, що керують поведінкою термінала (прапорець ECHO означає роботу в режимі луни):
int tcgetattr(int tfd. struct termios *modes);
int tcsetattr(int tfd. int actions, struct termios *modes):
де: tfd — дескриптор файла, що відповідає терміналу;
actions — час встановлення режиму (TCSAN0W - негайно).
Наведемо приклади використання цих викликів для відключення режиму луни і відновлення попереднього режиму.
#include <termios.h>
#include <sys/types
struct termios new_mode, old_mode:
// одержання поточного режиму
tcgetattr(STDIN_FILENO.&oldjrode);
new_mode = oldjnode: // відключення режиму луни
new_mode.сJflag &= (-ECHO);
tcsetattr (STDI N_F IL ENO, TCSANOW. Snewmode):
// ... введення-виведення з використанням STDIN_FILENO без луни
// відновлення попереднього режиму
tcsetattr(STDIN_FIL ENO.TCSANOW.Sold jnode):