TTY-alijärjestelmä tai TTY-abstraktio on yksi Unixin tai Unixin kaltaisten käyttöjärjestelmien, erityisesti Linuxin , perusta . Tämä järjestelmä on tarkoitettu yhden päätteen käyttöön useilla prosesseilla, joillakin syöttömahdollisuuksilla (esim. signaalien lähettäminen erikoisnäppäimillä, syötettyjen merkkien poistaminen).
Ominaisuudet, kuten merkkien ja taustan värin muuttaminen, merkkien tyylin muuttaminen, kohdistimen siirtäminen, riippuvat emulointiohjelmasta tai pääteohjaimesta. Tyypillisesti niiden toteuttamiseen käytetään ANSI-pakojaksoja .
Vuonna 1869 keksittiin ticker-kone - erityinen lennätinlaite arvopaperien hintatarjousten lähettämiseen . Vähitellen tästä laitteesta kehittyi teletypewriter , nopeampi laite, joka perustuu ASCII - merkkitaulukkoon . Aikanaan eri puolilta maailmaa tulleet teletyypit yhdistettiin jopa yhdeksi Telex -nimiseen verkkoon , jossa osoitus tehtiin samalla pyörivän akselin periaatteella etsijillä kuin silloisissa mekaanisissa automaattisissa puhelinkeskuksissa . Telex-verkkoa käytettiin kaupallisten sähkeiden välittämiseen. Teletyyppejä ei kuitenkaan vielä tuolloin ollut kytketty tietokoneisiin .
1960-luvulla tietokoneet pystyivät suorittamaan moniajoa samanaikaisesti . Erityisesti reaaliaikainen vuorovaikutus tietokoneen ja käyttäjän välillä on tullut mahdolliseksi . Kun vanha erätyönkäsittelymalli korvattiin komentoriviliittymällä , teletyyppejä alettiin käyttää syöttö- ja tulostuslaitteina , koska niitä oli jo saatavilla markkinoilla.
Koska oli olemassa monia erilaisia teletype-malleja, tietyn tason ohjelmistojen yhteensopivuus vaadittiin , jotta tietystä teletype -mallista voidaan irrottautua. UNIX- ja UNIX - tyyppisissä järjestelmissä teletypen matalan tason toiminta – esimerkiksi bittien määrä pakettia kohden, baudinopeus , vuonohjaus , pariteetti , erikoiskoodit alkeelliseen sivun muotoiluun jne. – jätettiin toiminnan varaan . järjestelmän ydin . Ominaisuudet, kuten kohdistimen liike , värillinen teksti jne., tulivat mahdollisiksi vasta 1970-luvun lopulla , kun videopäätteet , kuten VT-100 , syntyivät . Kaikki nämä lisäominaisuudet jätettiin sovellusten tehtäväksi .
Tietokoneiden jatkokehityksen myötä teletyypeistä ja sitten videopäätteistä tuli menneisyyttä. Niiden kanssa työskentelyyn käytettävät alijärjestelmät ovat kuitenkin pysyneet käyttöjärjestelmien ytimissä, vaikka ne ovatkin kokeneet merkittäviä muutoksia.
Oletetaan , että käyttäjä kirjoittaa kaukokirjoittimella ja tietokone tulostaa vastauksen. Teletyyppiä käytetään fyysisenä (todellisena) päätelaitteena . Se yhdistetään tietokoneeseen yleisen asynkronisen sarjaportin avulla . Käyttöjärjestelmässä on porttiohjain , joka vastaa tavujen fyysisestä siirrosta (pariteetti, vuonhallinta jne.). Yksinkertaisimmassa tapauksessa tämä ohjain voi yksinkertaisesti välittää tiedot sitä käyttävälle sovellukselle. Seuraavat ominaisuudet eivät kuitenkaan ole käytettävissä:
Se tarkoittaa mahdollisuutta poistaa painettuja merkkejä. UNIX-filosofian mukaan ohjelmat tulee pitää mahdollisimman yksinkertaisina , joten tämän toiminnon tarjoaa ytimen ajuri, ei teletype-ohjelma. Käyttöjärjestelmä tarjoaa puskurin tekstin muokkaamiseen sekä joitain yksinkertaisia muokkauskomentoja - "poista merkki", "poista sana", "poista rivi". Kaikki nämä toiminnot on toteutettu linjatieteen moduulissa . Ne ovat oletusarvoisesti käytössä ; tätä tilaa kutsutaan kanoniseksi tai kypsennetyksi (keitetyksi). Ohjelma voi halutessaan poistaa nämä toiminnot käytöstä vaihtamalla ohjaimen raaka (raaka) -tilaan. (Useimmat interaktiiviset konsoliohjelmat – tekstieditorit , sähköpostiagentit , komentotulkit ja kaikki Curses- tai Readline - ohjelmaa käyttävät ohjelmat – toimivat raakatilassa ja käsittelevät kaikki muokkauskomennot itse.) Mainitun protokollakerroksen avulla voit myös määrittää kaiun (kirjoitettujen merkkien näyttämisen samassa terminaalissa), automaattisen rivin loppu- ja rivinvaihtomerkkien muuntamisen jne. Protokollakerros on siis primitiivinen tekstin jäsentäjä , kuten Sed , ja työskentelee ydintilassa .
Yllä kuvatun käsittelyn erottamisen erilliseen kerrokseen on se, että kurinalaisuutta (eli tämän kerroksen erityistä ajuria) voidaan muuttaa dynaamisesti . Päätelaitteen sijaan voit ottaa käyttöön esimerkiksi pakettivälitteisen tiedonsiirron - ppp , IrDA , sarjahiiri jne.
Yleensä käyttäjä haluaa ajaa useita ohjelmia samanaikaisesti ja olla vuorovaikutuksessa niiden kanssa vuorotellen. Jos ohjelma jumiutuu , käyttäjä todennäköisesti haluaa kaataahänen. Taustalla käynnissä olevien prosessien pitäisi estyä heti, kun ne haluavat näyttää tekstiä näytöllä. Vastaavasti käyttäjän kirjoittama teksti tulee lähettää vain sillä hetkellä aktiiviselle ohjelmalle. Käyttöjärjestelmä toteuttaa kaikki nämä toiminnot TTY-ajurin avulla.
Sekä kurinalaisuus (protokolla) että TTY-ohjain ovat passiivisia . Toisin sanoen he eivät voi ryhtyä toimiin itse, vaan ne ovat vain joukko menettelyjä , joita voidaan kutsua muilla menettelyillä. Sitä vastoin käyttöjärjestelmä itsessään on prosessi , eli sillä on oma kontekstinsa .
UART-portin ohjaimen, tieteenalojen (protokollan) ja TTY-ohjaimen järjestelmää kutsutaan TTY-laitteeksi tai yksinkertaisesti TTY :ksi . Käyttäjäprosessi voi muuttaa minkä tahansa TTY-laitteen toimintaa käsittelemällä sitä vastaavaa tiedostoa/dev - kansiossa . Luonnollisesti tätä varten tällä prosessilla on oltava kirjoitusoikeudet.tähän tiedostoon. Eli kun käyttäjä kirjautuu sisäänja muodostaa yhteyden tiettyyn TTY:hen, kyseisen käyttäjän on tultava kyseistä TTY:tä vastaavan tiedoston omistajaksi . Kirjautumisohjelma tekee juuri tämän . (Kirjautumisohjelma itse toimii superkäyttäjänä ).
Harkitse nyt tilannetta, jossa järjestelmä toimii tavallisessa nykyaikaisessa henkilökohtaisessa tietokoneessa . Discipline ja TTY-ajuri toimivat samalla tavalla kuin ennenkin, mutta UART-portin ajuria ei enää ole, koska ei ole teletypeä, joka yhdistäisi sen kautta. Sen sijaan käytetään videopääte-emulaattoria - ohjelmaa, joka jäljittelee videopäätettä (samanlainen kuin teletype-kone, mutta jossa on videonäyttö paperinauhan sijaan) ja näyttää tämän päätteen sisällön näytöllä. Samaan aikaan tämä ohjelma, toisin kuin konsoli , on jo käynnissä käyttäjätilassaytimen sijaan, joka tarjoaa paljon enemmän joustavuutta; Voit esimerkiksi näyttää terminaalin ikkunassa , kuten Xterm tekee .
Pääteemulaattorin toiminnan mahdollistamiseksi käyttäjätilassa ja samalla ei hylätä koko edellä kuvattua TTY-alijärjestelmää, keksittiin ns. pseudopääte eli PTY. Pseudopäätettä voidaan ajaa toisen pseudopäätteen sisällä; näin tekee esimerkiksi Screen tai Ssh -asiakas .
Graafinen pääteemulaattori, kuten esimerkiksi xterm , luo ensin uuden pseudopäätteen ja aliprosessin, josta tulee uuden istunnon johtaja, tekee pseudopäätteen orjasta sen ohjaavan päätelaitteen ja käynnistää komentotulkin (useimmat usein bash tai sh). Pääte-emulaattori käyttää pseudopäätteen isäntäosaa näyttämään orjaosasta vastaanotettuja tietoja. Kaikki tulkista käynnistetyt prosessit, mukaan lukien itse tulkki, syöttävät ( stdin ) ja tulostavat ( stdout ja stderr ) orjan kautta.
Linuxissa on kaksi API :ta pseudopäätteen luomiseen ( pty(7)): UNIX 98 ( pts(4)) ja BSD. [yksi]
Ensimmäinen vaihtoehto on avata tiedosto /dev/ptmx(suositeltavaa käyttää int posix_openpt(int flags)), joka sitoo palautetun tiedoston kuvaajan isäntään ja /dev/pts/luo hakemistoon uuden orjatiedoston, jolla on positiivinen kokonaislukunimi. Jokainen tämän tiedoston avaaminen luo uuden pseudopäätteen. Ajetun osan tarkan polun selvittämiseksi on olemassa toiminto char* ptsname(int fd). Ennen kuin avaat käytettävän osan, sinun on soitettava grantptja unlockpt.
BSD:n tapauksessa /dev/hakemistossa on useita muotoa ttyXY(seuraaja) ja ptyXY(johtaja) olevia tiedostoja.
Tässä esimerkissä ps lvoit nähdä kunkin prosessin tilan käyttämällä komentoa, ja WCHAN-sarake näyttää tapahtuman, jota tietty nukkumisprosessi odottaa.
$ ps l F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY AIKAKOMENTO 0 500 5942 5928 15 0 12916 1460 odota Ss pts/14 0:00 -/bin/bash 0 500 12235 5942 15 0 21004 3572 odota S+ pts/14 0:01 vim index.php 0 500 12580 12235 15 0 8080 1440 odota 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 lPS-komennon tulosteen STAT-sarake näyttää prosessin tilan, mutta se voi sisältää myös useita lippuja:
Näitä määritteitä käytetään työn hallintaan . TTY-ajurin tehtävänä on pitää kirjaa aktiivisen prosessiryhmän tunnuksesta (jonka istunnon pääprosessi nimenomaan päivittää).
Seuraavat signaalit liittyvät suoraan TTY:hen:
HUOKAA UART-portin ohjain lähettää istunnon laajuisen SIGHUP-signaalin, kun modeemi siirtyy on-hook-tilaan. Tämä yleensä tappaa kaikki istunnon prosessit. Jotkut ohjelmat, kuten Screen tai Nohup , eroavat istunnosta ja TTY:stä, jotta heidän lapsiprosessinsa eivät kuole, kun modeemi irrotetaan. SIGINT TTY-ohjain tuottaa SIGINT-signaalin, kun erikoismerkki ^C(tämän merkin ASCII-koodi on 3) ilmestyy tulovirtaan. Kuljettaja lähettää tämän signaalin aktiiviseen työhön. Ohjelma, jolla on pääsy TTY:hen, voi muuttaa tämän erikoismerkin koodia tai estää tämän signaalin generoinnin kokonaan. Istunnonhallinta seuraa kunkin käynnissä olevan tehtävän asettamia TTY-asetuksia ja käyttää niitä, kun tehtävät vaihtuvat. SIGQUIT Samanlainen kuin SIGINT, luotava erikoismerkki: ^\. SIGPIPE Tämä signaali on hyödyllinen töissä, koska sen avulla tyyppikonstrukti yes | headvoi lopettaa kyllä-prosessin, kun pääprosessi päättyy. SIGCHLD Ydin lähettää SIGCHLD-signaalin prosessille, kun yksi sen aliprosesseista kuolee tai muuttaa tilaa. SIGCHLD-signaalin ohella waitpidvoit saada lisätietoja, kuten prosessi- ja käyttäjätunnukset, paluukoodin (tai kaatumisen aiheuttaneen signaalin). Tämän signaalin avulla istunnon isäntäprosessi valvoo tehtäviensä suorittamista. SIGSTOP Tämä signaali keskeyttää sen vastaanottavan prosessin suorittamisen. Vain aloitusprosessi voi käsitellä sen . Tyypillisesti ydin ei käytä tätä signaalia. Sen sijaan erikoismerkki ^Zlähettää SIGTSTP-signaalin, jonka sovellus voi jo napata; pääsääntöisesti sovellus suorittaa tiettyjä toimintoja, minkä jälkeen se pysähtyy - jo SIGSTOP-signaalilla. SIGCONT Tämä signaali herättää aiemmin nukkumaan asetetun prosessin. Shell lähettää sen, kun käyttäjä antaa komennon fg. Koska tätä signaalia ei voida käsitellä, odottamaton SIGCONT-signaali osoittaa, että prosessi keskeytettiin ja sitten herätettiin. SIGTSTP SIGTSTP on samanlainen kuin SIGINT ja SIGQUIT. Erikoismerkki ^Z( ASCII- koodi 26). SIGTTIN Kun taustalla käynnissä oleva prosessi yrittää lukea TTY:stä, TTY lähettää tämän signaalin koko työhön. Tämä yleensä keskeyttää työn, kunnes käyttäjä vaihtaa siihen ja voi syöttää odotetut tiedot. SIGTTOU Samanlainen kuin edellinen, mutta kutsutaan, kun taustaprosessi yrittää kirjoittaa TTY:hen. Tämä tämän TTY:n signaali voidaan poistaa käytöstä. SIGWINCH TTY lähettää SIGWINCH-signaalin aktiiviseen työhön, kun päätteen koko muuttuu.Harkitse seuraavaa esimerkkiä. Anna käyttäjän muokata tekstiä konsolin tekstieditorissa. Kursori on suunnilleen näytön keskellä, ja editori on vain kiireinen suorittamaan paljon suoritinaikaa vaativaa tehtävää (esimerkiksi sanojen etsiminen ja korvaaminen suuressa tiedostossa). Tässä vaiheessa käyttäjä painaa ^Z.
Jos tieteenala (linkkiprotokolla) on määritetty sieppaamaan tämä merkki, käyttäjän ei tarvitsisi odottaa, että editori suorittaa nykyisen työn, koska tieteenalataso lähettää välittömästi SIGTSTP-signaalin aktiiviselle tehtävälle (eli aktiiviselle prosessille). ryhmä). Lisäksi tämä ryhmä sisältää paitsi itse editorin, myös kaikki sen aliprosessit.
Anna editorin määrittää SIGTSTP-signaalin manuaalinen käsittely. Ydin kutsuu sitten keskeytyskäsittelijää (tekstinkäsittelyprosessin sisällä). Tämä käsittelijä siirtää kohdistimen ruudun viimeiselle riville kirjoittamalla tietyn ohjausmerkkisarjan TTY:hen. Koska editori on aktiivinen prosessi, nämä merkit siirretään ja käsitellään välittömästi. Sen jälkeen editori lähettää itselleen (ja prosessiryhmälleen) SIGSTOP-signaalin ja menee nukkumaan.
Se, että tekstieditori on mennyt nukkumaan, ilmoitetaan istunnon isäntäprosessille SIGCHLD-signaalilla (yhdessä nukkuvien prosessien tunnusten kanssa). Kun kaikki aktiivisen tehtävän prosessit menevät lepotilaan, istunnon johtaja muistaa nykyiset TTY-asetukset ja ilmoittaa itsensä kyseisen TTY:n aktiiviseksi tehtäväksi syscallilla ioctl. Sen jälkeen se tulostaa käyttäjälle ilmoituksen, että nykyinen tehtävä on keskeytetty.
Jos komentoa kutsutaan nyt ps, se näyttää, että tekstieditori on keskeytetty (kirjain "T"). Jos yrität herättää sen - esimerkiksi sisäänrakennetulla shell-komennolla bgtai killlähettämällä sille SIGCONT-signaalin - editori suorittaa SIGCONT-signaalinkäsittelijän. Tämä käsittelijä yrittää piirtää käyttöliittymän uudelleen kirjoittamalla ohjausmerkkijonon TTY:hen. Nyt editori on kuitenkin taustaprosessi, joten käyttöliittymän renderöinnin sijaan TTY lähettää SIGTTOU-signaalin editorille ja hän nukahtaa uudelleen. Istunnon isäntäprosessi tietää tästä SIGCHLD-signaalilla ja näyttää jälleen ilmoituksen käyttäjälle.
Jos komento sen sijaan kutsutaan, fgkomentotulkki palauttaa aiemmin tallennetut TTY-asetukset, tekee editorista jälleen aktiivisen tehtävän ja lähettää sille (ja sen prosessiryhmälle) SIGCONT-signaalin. Sen jälkeen editori pystyy piirtämään käyttöliittymänsä normaalisti ja työ jatkuu.
Voit selvittää TTY:n, joka hallitsee tiettyä komentotulkkiohjelmaa apuohjelman avulla tty.
Avoin TTY voidaan määrittää ioctl. Tämä käyttöliittymä ei kuitenkaan ole kannettava , joten sen sijaan on suositeltavaa käyttää POSIX-yhteensopivia kääreitä (katso man 3 termios).
TTY voidaan määrittää myös suoraan konsolista käyttämällä apuohjelmaa stty, joka perustuu yllä mainittuun API termios :han :
$ stty -a nopeus 38400 baudia; rivit 73; sarakkeet 238; rivi=0; intr = ^C; lopeta = ^\; pyyhkiä = ^?; tappaa = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch=<undef>; aloitus = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; arease = ^W; lseuraava = ^V; huuhtelu = ^O; min = 1; aika = 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 -fill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echokestty -anäyttää kaikki TTY-asetukset. Tietty TTY voidaan valita lipulla -F.
speednäyttää UART-portin nopeuden. Pseudopäätteet ohittavat tämän arvon.
rowsja columnsnäyttää päätteen koon merkeissä. Itse asiassa nämä ovat vain kaksi TTY-ohjaimen sisällä olevaa numeerista muuttujaa, joita voidaan vapaasti lukea ja muokata. Kun ne muuttuvat, aktiiviselle tehtävälle lähetetään SIGWINCH-signaali.
linenäyttää aktiivisen tieteenalan numeron. Kaikki järjestelmässä saatavilla olevat tieteenalat on lueteltu kohdassa /proc/tty/ldiscs.
Seuraavaksi luetellaan erikoismerkit ja sen jälkeen valitut vaihtoehdot. Viiva tarkoittaa, että vaihtoehto on poistettu käytöstä.
Jos avaat Xterm-ikkunan, muista sen TTY (kutsumalla komento tty) ja koko (kutsumalla komento stty -a), käynnistä koko näytön konsolisovellus (kuten vim ) ja kirjoita sitten toinen Xterm-ikkuna stty -F X rows Y, jossa X on TTY ensimmäisen ikkunan nimi, ja Y on puolet sen korkeudesta , niin vim vastaanottaa välittömästi SIGWINCH-signaalin ensimmäisessä ikkunassa ja piirtää käyttöliittymänsä uudelleen käyttämällä vain puolta sille tarjotusta ikkunasta.
Jos kirjoitat Xterm-ikkunaan stty intr o, SIGINT-signaali luodaan nyt, kun kirjoitat merkin "o". Tässä tapauksessa painaminen ^Cei johda mihinkään.
Joskus askelpalautin ei toimi UNIX-järjestelmässä . Tämä johtuu siitä, että pääteemulaattori lähettää eri ASCII-koodin TTY:lle kuin se, joka on määritetty kyseisessä TTY:ssä olevalle toiminnolle erase. Voit ratkaista tämän ongelman kirjoittamalla stty erase ^Htai stty erase ^?. Ensimmäinen komento asettaa poistomerkin ASCII-koodiksi 8, toinen 127:ksi. Nämä asetukset eivät vaikuta sovelluksiin, jotka toimivat raakatilassa.
Xterm-ikkunaan kirjoittaminen stty -icanonpoistaa kanonisen tilan käytöstä. Jos sen jälkeen yrität esimerkiksi ajaa kissa -ohjelmaa , kaikki tekstin muokkaamisesta vastaavat pikanäppäimet, kuten ^Utai edes askelpalautus, eivät toimi. Lisäksi catse vastaanottaa (ja vastaavasti tulostaa) tietoja ei riveillä, kuten aiemmin, vaan erillisillä merkeillä.
Jos kirjoitat Xterm-ikkunaan stty -echo, tämä poistaa kirjoittamiesi tietojen näyttämisen käytöstä. Ohjelman kutsuminen tämän jälkeen catosoittaa, että näppäimistöllä kirjoitetut tiedot eivät enää näy näytöllä (eli sinun on kirjoitettava teksti "sokeasti"). Enter-näppäimen painamisen jälkeen ydin välittää kuitenkin viimeksi tulostetun rivin ohjelmalle catja se näyttää sen jo näytöllä.
Xterm-ikkunaan kirjoittaminen stty -tostopsallii taustalla käynnissä olevien prosessien kirjoittamisen näytölle sen sijaan, että ne estyvät. Esimerkiksi komento (sleep 5; echo hello, world) &näyttää komentotulkkikehotteen, mutta 5 sekunnin kuluttua rivi näkyy konsolissa «hello, world». Jos tällä hetkellä työskentelet päätteen kanssa (esimerkiksi kirjoitat tekstiä), tämä rivi kiilautuu suoraan tähän kirjoitettuun tekstiin. Jos kirjoitat stty tostop, komennon (sleep 5; echo hello, world) &suorittaminen estää tämän prosessin SIGTTOU-signaalilla, koska 5 sekunnin kuluttua se yrittää näyttää tekstiä taustalla. Tyypillisesti kuori tällaisissa tapauksissa näyttää varoitusviestin (joko välittömästi tai seuraavassa kehotteessa).
Komento stty sanepalauttaa TTY-asetukset "järkeviksi" parametreiksi.
Lisätietoa löytyy järjestelmästä (info libc, "Job Control"). info