Ноу Інти, лекція, пристрої, термінали і процеси
термінальна лінія
Подібно до того як поняття "пристрій" позначає і зовнішній пристрій - "залізяку", і його логічне уявлення всередині системи, поняття "термінал" застосовується і до описаних вище пристроїв першого типу, і до спеціальних пристроїв другого типу, що має назву tty. Подавши команду ls / dev / * tty *. ми можемо виявити часом незліченна кількість пристроїв з ім'ям, що включає в себе tty. Всі ці пристрої - термінали. або термінальні лінії (в [6] про термінальну лінії розповідається досить докладно; ми ж обмежимося досить поверховим розглядом, достатнім для того, щоб у користувача не виникало тупикових ситуацій в роботі). З точки зору UNIX термінальні лінії - не просто пристрої. передають байти: деякі з цих байтів (наприклад, вже розглянуті нами в лекції 7 символи видалення) мають спеціальне значення. Справді, при наборі тексту в терміналі символ видалення поточного введення (зазвичай це ^ U) обробляє сама система (читай: термінальна лінія), а програма. яка чекає введення даних, цього не помічає. Інтерфейсом командного рядка підказаний порядковий режим роботи термінальної лінії. все, що вводиться користувачем, обробляється нею і накопичується в спеціальному буфері, поки не прийде символ кінця рядка. Після цього весь буфер передається очікує введення програмою (shell. Наприклад), а лінія починає заповнювати новий.
Поведінка термінальної лінії не залежить від здібностей терміналу. це властивість самої системи, так званий оброблений режим передачі даних (cooked mode). У деяких випадках, наприклад якщо програма хоче самостійно обробляти всі символи, що вводяться, термінальну лінію можна перевести в "сирий" режим (raw mode). Всілякі налаштування термінальної лінії видає команда stty -a (або stty --all). У числі інших налаштувань лінії будуть, наприклад, настройки перетворення символів переведення рядка (LF) і повернення каретки (CR) один в одного при введенні і виведенні. В UNIX прийнято, що рядки в текстовому файлі завершуються одним символом - New Line. NL. Цей символ зазвичай прирівнюється до символу перекладу рядка, LF. Тим часом на багатьох терміналах при виведенні рядка необхідні, як на друкарській машинці, два символу. спочатку - CR, потім - LF. Іноді терміналів досить одного символу, але CR. І навпаки, при введенні з клавіатури клавіша Enter може посилати і LF, і CR, і CR + LF. Деякі настройки stty визначають, що UNIX повинен розуміти як NL при введенні з клавіатури і виведення на екран поточного терміналу.
У видачі stty -a ми виявимо знайомі команди: ^ C. ^ D. ^ U і т. Д. Що вони означають? Команда stty дозволяє перевизначити найпростіші команди видалення введеного тексту: видалення символу (erase. Як правило, це - ^ H або ^?), Слова (werase. Як правило, ^ W) і всього рядка (kill. Як правило, ^ U). Навіщо це буває потрібно? Наприклад, термінал Volker Craig повертає ^ U при натисканні стрілки вправо. Хотілося б, щоб цей символ передавався програмі, а не оброблявся термінальній лінією. Команда stty kill ^ E перевизначити команду вилучити весь введений рядок на Ctrl + E. Зверніть увагу: ^ E в аргументах утиліти - це два символи, stty полегшує нам роботу, дотримуючись домовленість про подання керуючих послідовностей.
Інша група команд управляє найбільшою термінальній лінією. якщо, наприклад, ми хочемо припинити виведення на екран досить об'ємного тексту (забувши вчасно скористатися утилітою more або less), можна використовувати команду stop (зазвичай ^ S): вона повідомить системі, що термінал тимчасово не приймає дані, і чергова операція записі не завершиться до тих пір, поки лінія не отримає команду start (^ Q). Якщо якась програма вже прочитала всі дані з файлу, то чергова операція читання завершиться з діагностикою EOF (End Of File), яку програма повинна обробити. Якщо ж читання йде з терміналу. що для самої програми не відрізняються від читання з файлу, команда термінальної лінії eof (зазвичай ^ D) призведе до того ж результату.
Третя група команд має особливе значення. Це спосіб подавати програмі, що обмінюється даними з нашим терміналом. сигнали з клавіатури. Як сказано в [35]. сигнал - це спосіб обміну короткими повідомленнями між процесами в UNIX. За логікою роботи сигнал на системному рівні нагадує переривання на апаратній. Процес може ігнорувати сигнал. перехоплювати (обробляти його) або залишати на обробку системі. Сигнал процесу може виходити від іншого процесу. а може зародитися в надрах системи. Сигналів не дуже багато; для позначення різних, з точки зору відправника сигналу. ситуацій використовуються різні сигнали. Зокрема, для повної зупинки процесу використовується команда термінальної лінії intr (зазвичай це ^ C), яка подає сигнал INT (від interrupt. Переривання) процесу. чий стандартний ввід пов'язаний з цим терміналом.
Процеси і сигнали
З конкретної термінальній лінією може бути пов'язаний з введення тільки один процес. Цей процес називається активним і, крім властивості приймати сигнали з клавіатури, єдиний може зчитувати з неї дані. Решта запускаються користувачем процеси можуть тільки виводити на термінал. вводити вони повинні звідки-небудь ще. Ці процеси називаються фоновими. Якщо процес. отримав сигнал INT. не стане його обробляти, система припиняє його роботу. При цьому активним стає батьківський процес. і т. д. аж до демона getty. який і є перший процес. пов'язаний з введення з термінальною лінією. Більш докладно про getty буде розказано нижче, а про термінальні лінії. групи процесів та ін. можна прочитати в [6].
Якщо необхідно зупинити процес у що б то не стало, слід використовувати сигнал QUIT (quit. Зазвичай ^ \), який зазвичай не перехоплюється. Процес можна призупинити за допомогою сигналу STOP (susp. ^ Z). Тоді він тимчасово зупиниться, перестане бути активним і не буде працювати до тих пір, поки не отримає сигнал CONT (вже не з клавіатури, тому що, переставши бути активним, він втратить до неї доступ; багато командні інтерпретатори мають команди fg і bg для того , щоб призупинений процес продовжив працювати як активний або як фоновий відповідно).
Як уже зазначалося, першою система пов'язує з терміналом системну утиліту getty. задача якої - визначити тип терміналу і параметри введення / виведення, коли на лінії виникне активність. налаштувати лінію і викликати системну утиліту, яка займеться призначеними для користувача справами (найчастіше - утиліту login для аутентифікації користувача). Налаштовувати лінію не так-то просто, якщо до неї приєднаний модем. і дійсним термінальним пристроєм може виявитися будь-якій термінал користувача. Коли робота з лінією закінчена, модем "вішає трубку", а працює з лінією програма отримує сигнал HUP (від Hang UP). При отриманні цього сигналу система повинна забути всі старі настройки термінальної лінії (користувач -то від'єднався) і перезапустити getty. Правила запуску getty та інших обробників термінальної лінії вказуються в / etc / inittab (для гнізда USG) або в / etc / ttys (для гнізда BSD). Це породило ще одну домовленість UNIX. якщо демон отримує сигнал HUP. він повинен перезапуститися і заново вважати настройки; наприклад, якщо ми змінили настроювальний файл inetd. він помітить ці зміни після killall -HUP inetd.
Якщо в комп'ютері є порт послідовної передачі даних (на IBM PC він зазвичай відповідає стандарту RS-232), він цілком підійде для терміналу. Тому в / dev буде відповідне йому термінальне пристрій з ім'ям, що містить підрядок tty. в Linux, наприклад, воно буде носити ім'я ttyS0. а в FreeBSD - ttyd0. У FreeBSD, до речі, передбачено ще один пристрій. cuaa0. яке в дійсності працює з тим же портом, але передані дані не обробляє і сигналів не передає; одним словом, працює в "сирому" режимі. Рідко коли послідовних портів у системи більше чотирьох (частіше їх два). Звідки ж тоді такий обсяг видачі у ls / dev / * tty *?
Сучасна UNIX-система на основі IBM PC взагалі не включає в себе таке зовнішній пристрій. як термінал. Так воно й нема чого: до складу системного блоку входять і клавіатура, і монітор. здатний відображати графічну, а значить, і текстову інформацію. Правда, це цілком незалежні пристрої. натискання клавіш на клавіатурі обробляє спеціальний пристрій під назвою контролер клавіатури. а монітор відображає стан графічного адаптера. Однак якась частина ядра системи, іменована віртуальної консоллю. виконує функції терміналу. працюючи з монітором і клавіатурою як з єдиним пристроєм. Під консоллю в UNIX мається на увазі термінал (можливо, не єдиний), на який сама система виводить діагностику при роботі і з якого нею можна управляти. Призначення віртуальної консолі в тому, щоб користувач сидів за клавіатурою і монітором IBM PC як за терміналом. а UNIX "думав", що такий термінал у нього завжди є. Причому для зручності роботи віртуальних консолей зазвичай організовується відразу кілька, натискання в Linux або FreeBSD Alt + F6 призведе до того, що ви опинитеся як би перед терміналом з номером 6 і почнете працювати з ним, а запущена на пристрої / dev / tty6 (для FreeBSD - / dev / ttyv6) програма getty виявить активність саме на цьому пристрої.