devpts
devpts to wirtualny katalog systemu plików dostępny w jądrze Linuksa od wersji 2.1.93 (kwiecień 1998). Zwykle jest montowany w /dev/pts
i zawiera wyłącznie pliki urządzeń, które reprezentują urządzenia podrzędne dla mastera multipleksowania znajdującego się w /dev/ptmx
, który z kolei jest używany do implementacji emulatorów terminali (takich jak X11 xterm ).
Emulacja terminala
Pseudoterminal ("pseudo TTY" lub "PTY") to para pseudo-urządzeń - slave i master - które zapewniają specjalny rodzaj kanału komunikacyjnego. Pseudo-urządzenie podrzędne emuluje fizyczny terminal tekstowy komputera (jak np. DEC VT100 ) może odczytywać i zapisywać tekst tak, jakby był takim fizycznym terminalem. Pseudourządzenie nadrzędne zapewnia środki, za pomocą których program udostępniający tekstowy interfejs użytkownika współpracuje ze swoim urządzeniem podrzędnym i kontroluje je.
Szeroko rozpowszechnionymi programami z tekstowym interfejsem użytkownika są emulatory terminali (np. xterm , gnome-terminal lub Konsole ) lub programy wykorzystujące SSH lub telnet . Pisanie do mastera jest dokładnie takie samo, jak pisanie na terminalu, więc pseudo-urządzenie master zachowuje się trochę jak osoba siedząca przed fizycznym terminalem tekstowym komputera.
Para pseudoterminali jest podobna do potoku dwukierunkowego. Wszystko, co jest zapisane na urządzeniu głównym, pojawia się jako dane wejściowe na urządzeniu podrzędnym, a wszystko, co jest zapisane na urządzeniu podrzędnym, pojawia się jako dane wejściowe na urządzeniu głównym. Z punktu widzenia POSIX zdefiniowane urządzenia końcowe (pliki) mogą pracować w trybie pełnego dupleksu . Podobnie jak rury, pseudoterminale mają ograniczoną pojemność. W systemie Linux pojemność pseudoterminala wynosi około 4 KiB w każdym kierunku.
Typowy system operacyjny oparty na jądrze Linuksa zapewnia wiele PTY do obsługi interfejsów tekstowych, takich jak emulatory terminali (takie jak xterm lub gnome-terminal) oraz interfejsy dostępu zdalnego, takie jak SSH.
Powstanie devptów wynikało z chęci rezygnacji z programu pomocniczego setuid , np . /usr/libexec/pt_chown
. Jest to odrębna realizacja idei pseudoterminala; poprzednia implementacja zapewniała stałą liczbę par master/slave, które miały stałe węzły urządzeń, na przykład para master-slave /dev/ptyp63
i /dev/ttyp63
, por. Interfejs programowania systemu Linux, rozdział 62 „Terminale” i rozdział 64 „Pseudoterminale”.
Historia realizacji
W lutym 1998 r. Linux 2.1.87 przyniósł obsługę głównego urządzenia multipleksującego /dev/ptmx
. Otwarcie tego urządzenia zapewnia dostęp do nieużywanego w inny sposób pseudo-mastera TTY i umożliwia identyfikację pasującego urządzenia podrzędnego za pomocą ioctl()
. W kwietniu tego roku Linux 2.1.93 dodał nowy wirtualny system plików o nazwie devpts, który zwykle jest montowany w /dev/pts
. Za każdym razem, gdy tworzona jest nowa para master/slave, w tym wirtualnym systemie plików tworzony jest węzeł urządzenia dla slave.
Aby ułatwić przeniesienie emulacji terminala do przestrzeni użytkownika, przy jednoczesnym zachowaniu nienaruszonego podsystemu TTY (zarządzanie sesją i dyscyplina linii), wynaleziono pseudoterminal.
Powodem, dla którego dyscyplina liniowa jest wewnątrz jądra, jest unikanie przełączania kontekstu przy odbiorze każdego znaku (co we wczesnych czasach małych pamięci rdzeniowych oznaczałoby zamiany i zamiany!). Tak więc dyscyplina liniowa utrzymuje w buforze jądra linię danych wejściowych, a ponieważ jest wystarczająco proste przetestowanie określonego bajtu i zmniejszenie licznika w celu zaimplementowania „edycji” backspace (i kilku innych prostych funkcji edycyjnych), jest to zrobione tam .
Alternatywą jest użycie trybu surowego, w którym znaki są przekazywane do aplikacji zaraz po ich otrzymaniu, co jest potrzebne bardziej wyrafinowanym edytorom, takim jak (wówczas) słynny Emacs . I rzeczywiście, ponieważ emacs musiał używać tego surowego trybu, który implikuje zmianę kontekstu przy odbiorze każdego wpisanego znaku, nieustannie zmieniał się, gdy komputery nie miały wystarczającej ilości pamięci, aby utrzymać emacsa i wszystkie inne programy w rdzeniu.
Wraz z dodaniem pseudoterminali (PTY), kod TTY stał się również swego rodzaju mechanizmem komunikacji międzyprocesowej, z zachowaniem całej semantyki TTY. Kod TTY musi również obsługiwać protokoły sieciowe, takie jak PPP, bez tworzenia wąskich gardeł wydajności.