TTY absztrakció

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. augusztus 30-án felülvizsgált verziótól ; az ellenőrzések 8 szerkesztést igényelnek .

A TTY alrendszer vagy a TTY absztrakció a Unix vagy Unix-szerű operációs rendszerek, különösen a Linux egyik alapja . Ez a rendszer egy terminál több folyamat általi használatára szolgál, néhány beviteli lehetőség (pl. jelek küldése speciális gombokkal, beírt karakterek törlése).

Az olyan funkciók, mint a karakterek és a háttér színének megváltoztatása, a karakterek stílusának megváltoztatása, a kurzor mozgatása, az emulációs programtól vagy a terminál-illesztőprogramtól függenek. Ezek megvalósítására általában ANSI escape szekvenciákat használnak .

Történelem

1869-ben feltalálták a ticker gépet  - egy speciális távírógépet az értékpapír - jegyzések továbbítására . Fokozatosan ez az eszköz a teletypewriterré fejlődött , amely egy gyorsabb, ASCII karaktertáblázaton  alapuló eszköz . Egy időben a világ minden tájáról érkezett teletípusokat még egyetlen Telex nevű hálózatba is kapcsolták , amelyben a címzés ugyanazon a keresővel ellátott forgótengely elven zajlott, mint az akkori mechanikus automata telefonközpontokban . A Telex hálózatot kereskedelmi táviratok továbbítására használták. A teletípusok azonban akkor még nem kapcsolódtak számítógépekhez .

Az 1960-as évekre a számítógépek egyszerre többfeladatos munkavégzésre is képesek voltak . Különösen a számítógép és a felhasználó közötti valós idejű interakció vált lehetővé . Amikor az örökölt kötegelt munkafeldolgozó modellt felváltotta a parancssori interfész , a teletípusokat beviteli és kimeneti eszközként kezdték használni , mivel ezek már elérhetőek voltak a piacon.

Mivel a teletípusoknak sokféle modellje létezett, bizonyos szintű szoftver-kompatibilitásra volt szükség ahhoz , hogy elvonatkoztassunk egy adott teletípus- modelltől . UNIX és UNIX - szerű rendszerekben a teletípus alacsony szintű működését – például a bitek száma csomagonként, adatátviteli sebesség , áramlásvezérlés , paritás , speciális kódok a kezdetleges oldalformázáshoz stb. – a működésre bízták . rendszermag . Az olyan funkciók, mint a kurzormozgatás , a színes szöveg stb., csak az 1970 -es évek végén váltak lehetővé, a videoterminálok , például a VT-100 megjelenésével . Mindezeket a speciális funkciókat az alkalmazásokra bízták .

A számítógépek továbbfejlesztésével a teletípusok, majd a videoterminálok a múlté váltak. A velük való munkavégzés alrendszerei azonban, bár jelentős változásokon mentek keresztül, az operációs rendszerek kerneleiben maradtak.

Használati eset

Tegyük fel, hogy a felhasználó távírógépen gépel, és a választ a számítógép nyomtatja ki. A teletípust fizikai (valódi) terminálként használják . Univerzális soros aszinkron porton keresztül csatlakozik a számítógéphez . Az operációs rendszernek van egy port- illesztőprogramja , amely a bájtok fizikai átviteléért felelős (paritás, áramlásvezérlés stb.). A legegyszerűbb esetben ez az illesztőprogram egyszerűen át tudja adni az adatokat az azt használó alkalmazásnak. A következő szolgáltatások azonban nem lesznek elérhetők:

Sorszerkesztés

Ez magában foglalja a nyomtatott karakterek törlésének lehetőségét. A UNIX filozófiája szerint a programoknak a lehető legegyszerűbbeknek kell lenniük , így ezt a funkciót a kernel-illesztőprogram biztosítja, nem a teletype program. Az operációs rendszer puffert biztosít a szöveg szerkesztéséhez, valamint néhány egyszerű szerkesztési parancsot - "karakter törlése", "szó törlése", "sor törlése". Mindezek a funkciók a vonaltudományi modulban vannak megvalósítva . Alapértelmezés szerint engedélyezve vannak ; ezt a módot kanonikusnak vagy főttnek (főttnek) nevezik. A program kívánt esetben letilthatja ezeket a funkciókat, ha az illesztőprogramot nyers (nyers) módba kapcsolja. (A legtöbb interaktív konzolprogram – szövegszerkesztők , levelezőügynökök , shell -ek és minden Curses -t vagy Readline -t használó program – nyers módban fut, és maga kezeli az összes szerkesztési parancsot.) Az említett protokollréteg lehetővé teszi a visszhang konfigurálását (a beírt karakterek megjelenítése ugyanazon a terminálon), a sorvégi és kocsivisszaadási jelek automatikus konvertálását stb. Így a protokollréteg egy primitív szövegelemző , mint a Sed , és kernel módban dolgozik .

A fent leírt feldolgozás külön rétegre való szétválasztásának az a lényege, hogy a diszciplína (vagyis ennek a rétegnek a konkrét mozgatórugója) dinamikusan változtatható . Például a terminál diszciplína helyett bekapcsolhatja a csomagkapcsolt adatkommunikációs diszciplínát  - ppp , IrDA , soros egér stb.

Munkamenet menedzsment

Általános szabály, hogy a felhasználó egyszerre több programot akar futtatni, és felváltva kommunikálni velük. Ha a program lefagy , a felhasználó valószínűleg összeomlikneki. A háttérben futó folyamatokat azonnal le kell tiltani , amint szöveget akarnak megjeleníteni a képernyőn. Hasonlóképpen, a felhasználó által beírt szöveget csak az éppen aktív programnak szabad továbbítani. Az operációs rendszer ezeket a funkciókat a TTY illesztőprogram segítségével valósítja meg.

Mind a fegyelem (protokoll) réteg, mind a TTY-illesztőprogram passzív . Más szóval, maguk nem tudnak semmilyen intézkedést megtenni, hanem csak eljárások összességét alkotják , amelyeket más eljárások hívhatnak meg. Ezzel szemben az operációs rendszer maga egy folyamat , vagyis megvan a maga kontextusa .

Az UART port-illesztőprogramból, egy tudományágból (protokollból) és egy TTY-illesztőprogramból álló rendszert TTY-eszköznek vagy egyszerűen TTY -nek nevezik . Egy felhasználói folyamat megváltoztathatja bármely TTY-eszköz viselkedését a megfelelő fájl manipulálásávala /dev mappában . Természetesen ehhez a folyamatnak írási jogosultsággal kell rendelkeznie.ehhez a fájlhoz. Tehát amikor a felhasználó bejelentkezikés egy adott TTY-hez csatlakozik, akkor ennek a felhasználónak az adott TTY-nek megfelelő fájl tulajdonosává kell válnia. A bejelentkező program pontosan ezt teszi . (Maga a bejelentkező program szuperfelhasználóként fut ).

Most nézzük meg azt az esetet, amikor a rendszer egy közönséges modern személyi számítógépen fut . A Discipline és a TTY meghajtó ugyanúgy működik, mint korábban, de az UART port driver már nincs meg, hiszen nincs teletípus, ami azon keresztül csatlakozna. Ehelyett egy videoterminál emulátort használnak - egy olyan programot, amely egy videoterminált  imitál (hasonlóan a távírógéphez, de papírszalag helyett videoképernyővel ), és megjeleníti a terminál tartalmát a képernyőn. Ugyanakkor ez a program a konzollal ellentétben már fut a felhasználói térben, nem pedig a kernel, amely sokkal nagyobb rugalmasságot biztosít; Például megjeleníthet egy terminált egy ablakban , ahogy az Xterm teszi .

Pseudo terminál

Annak érdekében, hogy lehetővé tegyék a terminálemulátor működését a felhasználói térben, és egyúttal ne hagyják fel a fent leírt teljes TTY alrendszert, kitalálták az úgynevezett pszeudo-terminált, vagy PTY-t. Egy pszeudoterminál futtatható egy másik pszeudoterminálon belül; ezt csinálja például a Screen vagy az Ssh kliens .

Egy grafikus terminál emulátor, mint például az xterm , először létrehoz egy új pszeudoterminált és egy gyermekfolyamatot, amely az új munkamenet vezetője lesz, az álterminál slave-jét teszi vezérlő termináljává, és elindít egy parancsértelmezőt (a legtöbb gyakran bash vagy sh). A pszeudoterminál mester részét a terminálemulátor használja a slave résztől kapott adatok megjelenítésére. Az értelmezőtől elindított összes folyamat, beleértve magát az értelmezőt is, a bemenetet ( stdin ) és a kimenetet ( stdout és stderr ) végzi a slave-en keresztül.

Linuxon két API áll rendelkezésre pszeudoterminál létrehozásához ( pty(7)): UNIX 98 ( pts(4)) és BSD. [egy]

Az első lehetőség egy fájl megnyitása /dev/ptmx(használata javasolt int posix_openpt(int flags)), amely a visszaadott fájlleírót a gazdagéphez köti, és /dev/pts/egy új slave fájlt hoz létre a könyvtárban pozitív egész névvel. A fájl minden megnyitása új pszeudoterminált hoz létre. A meghajtott alkatrész pontos elérési útjának meghatározásához van egy függvény char* ptsname(int fd). A meghajtott alkatrész kinyitása előtt hívnia kell a grantptés a unlockpt.

A BSD /dev/esetében sok ttyXY(follower) és ptyXY(leader) alakú fájl található a könyvtárban.

A TTY helye a folyamatmodellben

Ebben a példában a paranccsal ps lmegtekintheti az egyes folyamatok állapotát , és a WCHAN oszlop megjeleníti azt az eseményt, amelyre egy adott alvó folyamat vár.

$ ps l F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 0 500 5942 5928 15 0 12916 1460 várjon Ss pts/14 0:00 -/bin/bash 0 500 12235 5942 15 0 21004 3572 várjon S+ pts/14 0:01 vim index.php 0 500 12580 12235 15 0 8080 1440 várjon S+ pts/14 0:00 /bin/bash -c (ps l) >/tmp/v727757/1 2>&1 0 500 12581 12580 15 0 4412 824 - R+ pts/14 0:00 ps l

A ps parancs kimenetének STAT oszlopa a folyamat állapotát mutatja, de több jelzőt is tartalmazhat:

Ezeket az attribútumokat használják a jobvezérléshez . A TTY-illesztőprogram feladata az aktív folyamatcsoport azonosítójának nyomon követése (amelyet a munkamenet főfolyamata kifejezetten frissít).

TTY és jelzés

A következő jelek közvetlenül kapcsolódnak a TTY-hez:

SÓGOTT Az UART port illesztőprogramja egy munkamenet-szintű SIGHUP jelet küld, amikor a modem „on-hook” állapotba kerül. Ez általában megöli a munkamenet összes folyamatát. Egyes programok, mint például a Screen vagy a Nohup , elkülönülnek a munkamenetüktől és a TTY-től, így a gyermekfolyamatok nem halnak meg, ha a modemet leválasztják. SIGINT A SIGINT jelet a TTY illesztőprogram generálja, amikor egy speciális karakter ^C(ennek a karakternek az ASCII kódja 3) megjelenik a bemeneti adatfolyamban. A vezető ezt a jelet küldi az aktív munkának. A TTY-hez hozzáféréssel rendelkező program megváltoztathatja ennek a speciális karakternek a kódját, vagy teljesen letilthatja a jel generálását. A munkamenet-kezelő nyomon követi az egyes futó feladatok által beállított TTY-beállításokat, és alkalmazza azokat, amikor ezek a feladatok váltanak. SIGQUIT Hasonló a SIGINT-hez, a generálandó speciális karakter: ^\. SIGPIPE Ez a jel hasznos a jobokban, mert lehetővé teszi, hogy a típuskonstrukció yes | headleállítsa az igen folyamatot, amikor a fejfolyamat befejeződik. SIGCHLD A kernel SIGCHLD jelet küld egy folyamatnak, amikor az egyik utódfolyamat meghal vagy állapotot vált. A SIGCHLD jel waitpidmellett további információkat kaphat, például a folyamatot és a felhasználói azonosítókat, a visszatérési kódot (vagy az összeomlást okozó jelet). Ennek a jelnek a segítségével figyeli a munkamenet gazdafolyamata feladatai végrehajtását. SIGSTOP Ez a jel felfüggeszti az azt fogadó folyamat végrehajtását. Csak az init folyamat tudja feldolgozni . Általában a kernel nem használja ezt a jelet. Ehelyett a speciális karakter ^ZSIGTSTP jelet küld, amelyet az alkalmazás már el tud fogni; az alkalmazás általában bizonyos műveleteket hajt végre, majd szünetelteti magát - már SIGSTOP jellel. SIGCONT Ez a jel felébreszti a korábban alvó folyamatot. A parancsértelmező akkor küldi el, amikor a felhasználó parancsot ad ki fg. Mivel ez a jel nem kezelhető, egy váratlan SIGCONT jel azt jelzi, hogy a folyamatot felfüggesztették, majd felébresztették. SIGTSTP A SIGTSTP hasonló a SIGINT-hez és a SIGQUIT-hoz. Speciális karakter ^Z( ASCII kód ​​26). SIGTTIN Amikor egy háttérben futó folyamat megpróbál olvasni egy TTY-ből, a TTY elküldi ezt a jelet a teljes jobnak. Ez jellemzően felfüggeszti a munkát, amíg a felhasználó át nem vált rá, és be nem tudja írni a várt adatokat. SIGTTOU Hasonló az előzőhöz, de akkor hívják meg, ha egy háttérfolyamat TTY-re próbál írni. Ez a jel ebből a TTY-ből letiltható. SIGWINCH A TTY SIGWINCH jelet küld az aktív jobnak, amikor a terminál mérete megváltozik.

Példa

Tekintsük a következő példát. Hagyja, hogy a felhasználó szerkeszthesse a szöveget egy konzolszövegszerkesztőben. A kurzor hozzávetőlegesen a képernyő közepén van, és a szerkesztő éppen egy olyan feladat végrehajtásával van elfoglalva, amely sok CPU-időt igényel (például szavak keresése és cseréje egy nagy fájlban). Ekkor a felhasználó megnyomja a gombot ^Z.

Ha a diszciplína (link protokoll) úgy lett beállítva, hogy elfogja ezt a karaktert, akkor a felhasználónak nem kellene megvárnia, amíg a szerkesztő befejezi az aktuális feladatot, mert a szakterületi réteg azonnal SIGTSTP jelet küld az aktív feladatnak (azaz az aktív folyamatnak). csoport). Sőt, ebbe a csoportba nemcsak maga a szerkesztő tartozik, hanem annak minden gyermekfolyamata is.

Hagyja, hogy a szerkesztő beállítsa a SIGTSTP jel kézi kezelését. A kernel ezután meghívja a megszakításkezelőt (a szövegszerkesztő folyamaton belül). Ez a kezelő a kurzort a képernyő utolsó sorára mozgatja úgy, hogy egy meghatározott vezérlőkarakter-sorozatot ír a TTY-be. Mivel a szerkesztő egy aktív folyamat, ezek a karakterek azonnal átvitelre és feldolgozásra kerülnek. A szerkesztő ezután SIGSTOP jelet küld magának (és folyamatcsoportjának), és alvó üzemmódba lép.

A szövegszerkesztő alvó állapotát a SIGCHLD jelzéssel jelzi a munkamenet master folyamata (az alvó folyamatok azonosítóival együtt). Amikor az aktív feladat összes folyamata alvó állapotba kerül, a munkamenet vezetője megjegyzi az aktuális TTY-beállításokat, és a syscall segítségével deklarálja magát az adott TTY aktív feladatának ioctl. Ezután értesítést nyomtat a képernyőn a felhasználónak, hogy az aktuális feladatot felfüggesztették.

Ha a parancsot most hívják psmeg, akkor azt jelzi, hogy a szövegszerkesztő szünetel ("T" betű). Ha megpróbálja felébreszteni - például egy shell beépített paranccsal bg, vagy killSIGCONT jel küldésével - a szerkesztő futtatja a SIGCONT jelkezelőt. Ez a kezelő megpróbálja újrarajzolni az interfészt úgy, hogy egy vezérlőkarakter-sorozatot ír a TTY-be. A szerkesztő azonban most egy háttérfolyamat, így a felület renderelése helyett a TTY SIGTTOU jelet küld a szerkesztőnek, és az újra elalszik. A munkamenet gazdagépe a SIGCHLD jellel értesül erről, és ismét egy értesítést jelenít meg a felhasználónak.

Ha helyette a parancsot hívják meg, fgakkor a shell visszaállítja a korábban elmentett TTY beállításokat, ismét aktív feladattá teszi a szerkesztőt, és SIGCONT jelet küld neki (és folyamatcsoportjának). Ezt követően a szerkesztő normálisan meg tudja rajzolni a felületét, és a munka folytatódik.

TTY beállítás

Az adott shell programot kezelő TTY-t a segédprogram segítségével találhatja meg tty.

Egy nyitott TTY konfigurálható a segítségével ioctl. Ez az interfész azonban nem hordozható , ezért javasolt helyette POSIX-kompatibilis wrappereket használni (lásd man 3 termios).

A TTY közvetlenül a konzolról is konfigurálható a fent említett APIstty -n alapuló segédprogram segítségével : termios

$ stty -a sebesség 38400 baud; 73. sor; oszlopok 238; sor=0; intr = ^C; kilépés = ^\; törlés = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch=<undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; arease = ^W; lnext = ^V; öblítés = ^O; min = 1; idő = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

stty -amegjeleníti az összes TTY beállítást. Egy adott TTY kiválasztható a zászló segítségével -F.

speedmutatja az UART port sebességét. A pszeudoterminálok figyelmen kívül hagyják ezt az értéket.

rowsés columnsmutassa meg a terminál méretét karakterekben. Valójában ez csak két numerikus változó a TTY-illesztőprogramon belül, amelyek szabadon olvashatók és módosíthatók. Amikor ezek megváltoznak, a rendszer egy SIGWINCH jelet küld az aktív feladatnak.

lineaz aktív tudományág számát mutatja. A rendszerben elérhető összes tudományág a listában található /proc/tty/ldiscs.

A következő listában a speciális karakterek láthatók, majd az aktuálisan kiválasztott opciók. A kötőjel azt jelenti, hogy az opció le van tiltva.

Példák

Ha megnyit egy Xterm ablakot, emlékezzen annak TTY-jére (a parancs meghívásával tty) és méretére (a parancs meghívásával stty -a), indítson el egy teljes képernyős konzolalkalmazást (például vim ), majd írjon be egy másik Xterm ablakot stty -F X rows Y, ahol X a TTY. az első ablak neve, Y pedig a magasságának a fele, akkor a vim azonnal kap egy SIGWINCH jelet az első ablakban, és újrarajzolja az interfészét a számára biztosított ablak felének felhasználásával.

Ha beírja az Xterm ablakot stty intr o, akkor az "o" karakter begépelésekor a SIGINT jel jön létre. Ebben az esetben a megnyomás ^Cnem vezet semmire.

A Backspace gomb néha nem működik UNIX rendszeren . Ennek az az oka, hogy a terminálemulátor más ASCII-kódot küld a TTY-nek, mint ami az adott TTY-ben a funkcióhoz van rendelve erase. A probléma megoldásához be kell írnia a stty erase ^Hvagy stty erase ^?. Az első parancs a törlés karaktert 8-as ASCII-kódra, a második 127-re állítja be. A nyers módban futó alkalmazásokat nem érintik ezek a beállítások.

Az Xterm ablakba való beírás stty -icanonletiltja a kanonikus módot. Ha ezután megpróbálja például futtatni a macska programot , a szövegszerkesztésért felelős billentyűparancsok, például ^Uvagy akár a backspace, nem fognak működni. Ezenkívül catnem sorokban fog fogadni (és ennek megfelelően kiadni) az adatokat, mint korábban, hanem külön karakterekkel.

Ha beír egy Xterm ablakot stty -echo, ez letiltja a beírt adatok megjelenítését. Ezt követően a program meghívása azt catmutatja, hogy a billentyűzeten beírt adatok már nem jelennek meg a képernyőn (vagyis "vakon" kell begépelni a szöveget). Az Enter billentyű lenyomása után azonban a kernel az utoljára nyomtatott sort továbbítja a programnak cat, és máris megjeleníti a képernyőn.

Ha beír egy Xterm ablakot stty -tostop, akkor a háttérben futó folyamatok blokkolása helyett a képernyőre írhatnak. Például a parancs (sleep 5; echo hello, world) &megjelenít egy shell promptot, de 5 másodperc elteltével a sor megjelenik a konzolon «hello, world». Ha jelenleg a terminállal dolgozik (például beír valamilyen szöveget), akkor ez a sor közvetlenül a begépelt szövegbe fog ékelődni. Ha beírja stty tostopa parancsot, akkor a parancs futtatása (sleep 5; echo hello, world) &SIGTTOU jellel blokkolja ezt a folyamatot, mert 5 másodperc múlva megpróbál szöveget megjeleníteni a háttérben. Általában a shell ilyen esetekben figyelmeztető üzenetet jelenít meg (akár azonnal, akár a következő promptnál).

A parancs stty sanevisszaadja a TTY-beállításokat "ésszerű" paraméterekre.

További információk a rendszerben találhatók (info libc, "Job Control"). info

Jegyzetek

  1. férfi 7 pty (2017. szeptember 15.). Letöltve: 2017. október 6. Az eredetiből archiválva : 2017. október 7..

Forrás