Jeśli uruchomisz terminal i wywołasz plik wykonywalny (zakładając, że jest on zorientowany liniowo dla uproszczenia), otrzymasz odpowiedź na polecenie z pliku wykonywalnego. Jak to jest drukowane dla ciebie (użytkownika)? Czy terminal robi coś takiego pexpect
? (ankieta czeka na wyjście) czy co? Jak otrzymuje powiadomienie o wydruku do wydrukowania? Jak terminal uruchamia program? (Czy jest to coś podobnego do os.fork ()? Pythona). Zastanawiam się, jak działa terminal, bawię się jakimś emulatorem terminala i nadal nie rozumiem, jak działa cała ta magia. Patrzę na źródło konsoli (kde) i yakuake (prawdopodobnie używa konsoli) i nie mogę się dowiedzieć, gdzie dzieje się cała ta magia.
terminal
tty
terminal-emulator
architecture
pty
mikrofon
źródło
źródło
Odpowiedzi:
Początkowo miałeś tylko głupie terminale - początkowo tak naprawdę maszyny do pisania (podobne do elektrycznej maszyny do pisania, ale z rolką papieru) (stąd / dev / tty - TeleTYpers), ale później ekran + kombinacje klawiszy - które właśnie wysłały kod klucza do komputera, a komputer odesłał polecenie, które napisało list na terminalu (tj. terminal nie miał lokalnego echa, komputer musiał nakazać terminalowi napisanie tego, co użytkownik wpisał na terminalu) - jest to jeden z powodów dlaczego tak wiele ważnych poleceń Uniksa jest tak krótkich. Większość terminali była podłączona liniami szeregowymi, ale (przynajmniej) jeden był bezpośrednio podłączony do komputera (często tego samego pokoju) - była to konsola. Zaufało tylko kilku wybranym użytkownikom, którzy pracowali na „konsoli” (był to często jedyny „terminal” dostępny w trybie pojedynczego użytkownika).
Później pojawiły się również terminale graficzne (tak zwane „xterminale”, których nie należy mylić z
xterm
-programem) z ekranem i graficzną kartą ekranową, klawiaturą, myszą i prostym procesorem; który może po prostu uruchomić serwer X. Nie wykonali żadnych obliczeń, więc klienci X działali na komputerze, z którym byli połączeni. Niektóre miały dyski twarde, ale mogły także uruchamiać się przez sieć. Były popularne na początku lat 90., zanim komputery stały się tak tanie i wydajne.„Emulator terminala” - „okno terminala” otwierane za pomocą programów takich jak
xterm
lubkonsole
- próbuje naśladować funkcjonalność takich głupich terminali. Również programy takie jakPuTTY
(Windows) emulują terminale.Na PC, gdzie „konsola” (klawiatura + ekran) i „komputer” są bardziej pojedynczą jednostką, masz zamiast tego „wirtualne terminale” (w Linuksie klawisze Alt + F1 do Alt + F6), ale one też naśladują terminale w starym stylu. Oczywiście, ponieważ Unix / Linux stał się bardziej stacjonarnym systemem operacyjnym często używanym przez pojedynczego użytkownika, teraz większość pracy wykonujesz „na konsoli”, gdzie użytkownicy wcześniej korzystali z terminali połączonych liniami szeregowymi.
Oczywiście jest to powłoka, która uruchamia programy. I używa fork-systemcall (język C), aby wykonać swoją kopię z ustawieniami środowiska, a następnie exec-systemcall służy do przekształcenia tej kopii w polecenie, które chcesz uruchomić. Powłoka zawiesza się (chyba że polecenie zostanie uruchomione w tle), dopóki polecenie się nie zakończy. Ponieważ polecenie dziedziczy ustawienia dla stdin, stdout i stderr z powłoki, polecenie zapisze na ekranie terminala i odbierze dane z klawiatury terminala.
źródło
Kiedy „otwierasz terminal”, uruchamiasz program emulatora terminala, taki jak xterm, gnome-terminal, lxterm, konsola,…
Jedną z pierwszych rzeczy, które wykonuje emulator terminala, jest przydzielenie pseudo terminala (często nazywanego pseudo-tty lub w skrócie pty). Pty to para plików urządzeń znakowych : pty master, czyli strona, którą otwiera emulator terminala, i pty slave, czyli strona, którą otwierają programy działające w terminalu. W większości współczesnych jednorożców, master jest
/dev/ptmx
(który ma każdy emulator terminala), a slave jest/dev/pts/NUMBER
. Sterownik jądra dla pseudo-terminali śledzi, który proces kontroluje master dla każdego urządzenia slave. Emulator terminala może pobrać ścieżkę do odpowiedniego urządzenia podrzędnego poprzez ioctl na urządzeniu głównym.Gdy emulator terminala otworzy urządzenie nadrzędne, uruchamia podproces (zazwyczaj powłokę, ale decyzję podejmuje użytkownik, który wywołał emulator terminala). Emulator robi to w zwykły sposób, aby wywołać program:
Gdy dziecko (lub jakikolwiek inny proces) pisze do pty slave, emulator widzi dane wejściowe w pty master.
I odwrotnie, gdy emulator zapisuje do urządzenia nadrzędnego, jest to postrzegane jako wejście na urządzeniu podrzędnym.
Spodziewaj się, że działa dokładnie w ten sam sposób. Różnica między Expect a emulatorem terminali, takim jak xterm, polega na tym, że otrzymują dane wejściowe, którymi karmią program (skrypt vs klawiatura) i co robią z danymi wyjściowymi (plik dziennika lub parser vs rysunek tekstu w oknie).
źródło
script
polecenia BusyBox , w którejxgetpty
funkcja jest rdzeniem pracy/dev/ptmx
.