Według mojej wiedzy /dev/pts
pliki są tworzone dla sesji ssh lub telnet.
tty
.
Według mojej wiedzy /dev/pts
pliki są tworzone dla sesji ssh lub telnet.
tty
.
Odpowiedzi:
Nic nie jest przechowywane /dev/pts
. Ten system plików żyje wyłącznie w pamięci.
Wpisy /dev/pts
są pseudoterminalami (w skrócie pty). Jądra uniksowe mają ogólne pojęcie terminali . Terminal zapewnia aplikacjom sposób wyświetlania danych wyjściowych i odbierania danych wejściowych za pośrednictwem urządzenia końcowego . Proces może mieć terminal sterujący - w przypadku aplikacji w trybie tekstowym jest to sposób interakcji z użytkownikiem.
Terminale mogą być terminalami sprzętowymi („tty”, skrót „teletype”) lub pseudo-terminalami („pty”). Terminale sprzętowe są podłączone przez niektóre interfejsy, takie jak port szeregowy ( ttyS0
,…) lub USB ( ttyUSB0
,…), lub za pomocą ekranu komputera i klawiatury ( tty1
,…). Pseudo-terminale są dostarczane przez emulator terminala, który jest aplikacją. Niektóre typy pseudo-terminali to:
Jeśli program otworzy terminal do zapisu, dane wyjściowe z tego programu pojawią się na terminalu. Powszechnie jest, że kilka programów wysyła jednocześnie dane do terminala, choć czasem może to być mylące, ponieważ nie ma sposobu, aby stwierdzić, która część wyniku pochodzi z którego programu. Procesy w tle, które próbują zapisać na swoim terminalu sterującym, mogą zostać automatycznie zawieszone przez sygnał SIGTTOU .
Jeśli program otworzy terminal do odczytu, dane wejściowe użytkownika są przekazywane do tego programu. Jeśli wiele programów odczytuje z tego samego terminala, każdy znak jest kierowany niezależnie do jednego z programów; nie jest to zalecane. Zwykle w danym momencie tylko jeden program aktywnie odczytuje z terminala; programy, które próbują czytać z terminala sterującego, gdy nie znajdują się na pierwszym planie, są automatycznie zawieszane przez sygnał SIGTTIN .
Aby eksperymentować, uruchom tty
w terminalu, aby zobaczyć, jakie jest urządzenie końcowe. Powiedzmy, że to /dev/pts/42
. W powłoce w innym terminalu uruchom echo hello >/dev/pts/42
: ciąg hello
zostanie wyświetlony na drugim terminalu. Teraz uruchom cat /dev/pts/42
i wpisz drugi terminal. Aby zabić to cat
polecenie (co utrudni korzystanie z drugiego terminala), naciśnij Ctrl+ C.
Pisanie na innym terminalu jest czasami przydatne do wyświetlenia powiadomienia; na przykład write
polecenie to robi. Odczytywanie z innego terminala zwykle nie jest wykonywane.
strace
program czytać dane wejściowe, ale to wszystko.
tostop
ustawiona jest flaga tty. Ta flaga nie jest ustawiona domyślnie. I jestem poprawiony na czytaniu od innego TTY. Próbowałem i działa, ale działa to na podstawie odczytu, a nie na znak (gdy są wyświetlane w zachęcie powłoki, są takie same, jak powłoki odczytują 1 znak na raz). Warto wyjaśnić tę kwestię, ponieważ właśnie w ten sposób zinterpretowałem twoją odpowiedź.
read
wywołanie zwróci tylko kolejne znaki (a raczej bajty, powinienem powiedzieć), ale aplikacja nie ma kontroli nad tym, ile bajtów read
zwróci wywołanie, więc nie jest lepiej.
Pliki w /dev/pts
to „pseudo-ttys”. W pewnym stopniu przypominają nazwane rury, ale imitują również stare terminale szeregowe, takie jak VT-100. Pseudo-tty wykonują transfer bajtów z klawiatury do programu oraz z programu do urządzenia wyjściowego, co brzmi prosto. Ale to odpowiada na twoje wyraźne pytanie: jądro niczego /dev/pts/0
na przykład nie przechowuje . Wchodzą tylko strumienie bajtów ze standardowego programu podłączonego do pseudo-tty, a programy, których standardowe wejście jest podłączone do tego samego pseudo-tty, odczytują te bajty.
Pseudo-tty również umieszczają warstwę pośrednią w tych strumieniach bajtów. Jądro może sprawdzać bajty pod kątem specjalnych wartości, takich jak „Control-C” lub „Control-D” lub „Control-U” (wszystkie są konfigurowalne, patrz man stty
) i wysyłać SIGINT, ustawiać koniec pliku na standardowe wyjście lub kasować linia na wejściu. Gdzieś tam jest też funkcja buforowania, więc moje „przechowywanie niczego” jest nieco błędne, ale tylko o kilka kilobajtów.
Jądro może sprawdzać wartości bajtów na wyjściu i wykonywać takie czynności, jak przekształcanie nowego wiersza (ASCII linefeed, LF lub "\n"
) w dwa bajty, powrót karetki i linefeed (CRLF lub "\r\n"
) lub cokolwiek innego, czego wymaga sprzęt na terminalu szeregowym. Pośrednictwo pseudo-tty pozwala na niezależność od sprzętu.
Pseudo-tty pozwalają również na wszystkie „ ioctl()
systemowe szybkości transmisji”, „ustawianie parzystości” i tak dalej , i prawdopodobnie nic z nimi nie robią. Pozwala to programom, które zostały zapisane w dniu VT-100, ADM-3 i Whatever Wyse, kontynuować pracę bez pomyłek. Oprogramowanie, sterownik urządzenia pseudo-ttys, działa jak sprzęt.
Pseudo-tty mogą być używane przez sshd
i telnet
, ale są również używane między emulatorem terminala (takim jak xterm
lub rxvt
) a powłoką, która zazwyczaj działa wewnątrz xterm.
Linux i wiele uniksów ma pseudo-tty. Plan 9 nie. Pseudo-tty są trochę reliktem, pozostałym po dniach terminali sprzętowych podłączonych kablem szeregowym.
/dev/
to specjalny katalog dla plików urządzeń. To są abstrakcje, nie są prawdziwymi plikami na dysku. Katalog jest wypełniana przy starcie i może ulec zmianie w celu uwzględnienia istniejących interfejsów urządzeń, które są tworzone i niszczone przez jądra i demona przestrzeni użytkownika, udevd
.
Wiele reprezentowanych w ten sposób urządzeń jest wirtualnych. Obejmuje to wpisy w /dev/pts
, które są urządzeniami konsoli. Dlatego stworzono jedną z nich dla sesji zdalnych; są one również tworzone po otwarciu lokalnego terminala GUI.
Możesz je otworzyć jako pliki, chociaż nie ma to dużej wartości użytkowej. Aby uzyskać /dev/pts
węzeł, do którego podłączona jest powłoka, użyj tty
:
> tty
/dev/pts/4
Teraz przełącz się na inną konsolę i spróbuj:
> echo "duck!" > /dev/pts/4
Sprytny. Spróbuj teraz:
> cat /dev/pts/4
Następnie spróbuj użyć powłoki w / dev / pts / 4. Utkniesz, dopóki nie wyjdziesz cat
z drugiej strony, ale większość tego, co wpiszesz na pts / 4, przejdzie (np. Wypróbowanie „hello world”, na którym skończyłem hl
na pts / 4 i ello word
na cat
konsoli).
Domyślam się, że urządzenie pobiera dane wejściowe z powłoki i wysyła je przez system, tak jak rzeczy trafiają na ekran - powłoka nie obsługuje sprzętu, system jest. Spróbuj strace bash
(i zobacz, man strace
jeśli nie wiesz, co to jest); po uruchomieniu basha pojawia się wstępna liczba połączeń. Teraz zacznij uderzać w klawisze:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Dla każdej wpisanej litery jest odczyt ze standardowego wejścia i zapis do standardowego wyjścia. Ale z czym jest związany standard powłoki? Teraz wypróbuj strace
terminal GUI - jeśli nie znasz, musisz wymyślić nazwę, np. W KDE konsole
, a GNOME ma gnome-terminal
, jak sądzę. Wynik z tego strace
jest prawdopodobnie bardziej tajemniczy - mój ma wiele poll()
i recvfrom()
. Nie widzę żadnych zapisów, ale jeśli teraz wyciągniesz cat
lewę z innego terminala, zauważysz, że podczas pisania, naciśnięcia klawiszy, które czytają cat, nie powodują żadnej odpowiedzi na wyjściu strace - terminal nie jest odbieram je. Tak więc aplikacja terminala GUI i cat rywalizują o odczyt z tego samego urządzenia, na którym wyprowadzana jest powłoka.
echo Hello > /dev/pts/1
... Zobacz, co się stanie, to twój terminal.