KNOW INTUIT, Лекция, Устройства, терминали и процеси

Терминална линия

Точно както терминът "устройство" се отнася както за външно хардуерно устройство, така и за неговото логическо представяне в системата, терминът "терминал" се отнася както за първия тип устройства, описани по-горе, така и за специалните устройства от втори тип, наречени tty. Като издадем командата ls /dev/*tty*, понякога можем да намерим безброй устройства с име, което включва tty. Всички тези устройства са терминали или терминални линии (в [6] терминалната линия е описана достатъчно подробно; ние ще се ограничим до доста повърхностно разглеждане, достатъчно, за да гарантираме, че потребителят няма ситуации на безизходица при работа). От гледна точка на UNIX терминалните линии не са просто устройства, които предават байтове: някои от тези байтове (например символите за изтриване, които вече бяха обсъдени в Глава 7) имат специално значение. Наистина, когато пишете в терминала, текущият въведен знак за изтриване (обикновено ^U ) се обработва от самата система (да се чете: терминален ред), а програмата, която чака въвеждане на данни, не забелязва това. Интерфейсът на командния ред предлага работа ред по ред на терминалния ред: всичко, което е въведено от потребителя, се обработва от него и се натрупва в специален буфер, докато пристигне знакът за край на реда. След това целият буфер се прехвърля към програмата, чакаща въвеждане (например shell) и редът започва да се запълва с нов.

Поведението на линията на терминала не зависи от възможностите на терминала: това е свойство на самата система, така нареченият режим на пренос на обработени данни (готвен режим). В някои случаи, например, ако програмата иска сама да обработи всички въведени символи, крайният ред може да бъде поставен в необработен режим ( необработен режим ).Всички видове настройки на терминалната линия се издават от командата stty -a (или stty --all). Други настройки за ред включват, например, настройки за преобразуване на символи за подаване на ред (LF) и символи за връщане на карета (CR) един в друг по време на въвеждане и извеждане. В UNIX е обичайно редовете в текстов файл да завършват сединсимвол - нов ред, 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 ни улеснява, като спазва конвенцията за представяне на последователности за избягване.

Друга група команди управлява самата линия на терминала: ако например искаме да спрем извеждането на доста обемен текст на екрана (забравяйки да използваме повече или по-малко помощната програма навреме), можем да използваме командатастоп (обикновено ^S): ще каже на системата, че терминалът временно не получава данни и следващата операция за запис няма да завърши, докато редът не получи командата за стартиране (^Q). Ако програмата вече е прочела всички данни от файла, тогава следващата операция по четене ще завърши с EOF (End Of File) диагностика, която програмата трябва да обработи. Ако се чете от терминала, което е неразличимо от четенето от файл към самата програма, командата на терминалния ред eof (обикновено ^D ) ще доведе до същия резултат.

Третата група команди е от особено значение. Това е начин да дадем програма, която комуникира с нашия терминал, сигнали от клавиатурата. Както е посочено в [35], сигналът е начин за обмен на кратки съобщения между процеси в UNIX. По логиката на работа сигналът на системно ниво наподобявапрекъсванена хардуерно ниво. Процесът може да игнорира сигнала, да го прихване (обработи) или да го остави на системата за обработка. Сигнал към даден процес може да дойде от друг процес или да произхожда от вътрешностите на системата. Няма много сигнали; различни сигнали се използват за обозначаване на различни, от гледна точка на подателя на сигнала, ситуации. По-специално, командата intr на терминалния ред (обикновено ^C ) се използва за пълно спиране на процеса, което дава INT сигнал (от interrupt ) към процеса, чийто стандартен вход е свързан с този терминал.

Процеси и сигнали

Само един процес може да бъде свързан с конкретна терминална линия чрез въвеждане. Този процес се нарича активен и в допълнение към възможността за получаване на сигнали от клавиатурата, единственият може да чете данни от нея. Други стартирани от потребителите процеси могат да извеждат само към терминала, те трябва да влязат от някъде другаде. Тези процеси се наричат ​​фонови. Ако процесът, получил сигнал INT , няма да го обработи, системата спира работата си. След това родителският процес става активен и така нататък до getty daemon, който е първият процес, свързан чрез вход към терминалната линия. Повече подробности за getty ще бъдат обсъдени по-долу, а за терминалните линии, процесните групи и т.н. могат да бъдат намерени в [6].

Ако е необходимо да се спре процеса на всяка цена, трябва да се използва сигналът QUIT ( quit , обикновено ^\ ), който обикновено не се улавя. Процес може да бъдеспрянсъс сигнал СТОП (susp, ^Z). След това временно ще спре, ще спре да бъде активен и няма да работи, докато не получи сигнала CONT (вече не от клавиатурата, защото след като спре да бъде активен, ще загуби достъп до него; много черупки имат fg и bg команди, така че спреният процес да продължи да работи съответно като активен или като фон).

Както вече беше отбелязано, системата първо свързва системната помощна програма getty с терминала, чиято задача е да определи типа на терминала и входно-изходните параметри, когато възникне активност по линията, да настрои линията и да извика системната помощна програма, която ще се грижи за потребителските въпроси (най-често помощната програма за влизане за удостоверяване на потребителя). Създаването на линия не е лесно, ако към нея е свързан модем, а действителнототерминалноустройство може да бъде всеки потребителски терминал. Когато линията приключи, модемът "затваря", а програмата, работеща с линията, получава 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 си "мисли", че винаги има такъв терминал. Освен това, за удобство на виртуалните конзоли, обикновено се организират няколко наведнъж, натискането на Alt + F6 в Linux или FreeBSD ще доведе до факта, че ще се озовете пред терминала с номер 6 и ще започнете да работите с него, а програмата getty, работеща на устройството /dev/tty6 (за FreeBSD - /dev/ttyv6 ), ще открие активност на това устройство.