Według mojej wiedzy /dev/ptspliki są tworzone dla sesji ssh lub telnet.
tty.
Według mojej wiedzy /dev/ptspliki 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/ptssą 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 ttyw 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 hellozostanie wyświetlony na drugim terminalu. Teraz uruchom cat /dev/pts/42i wpisz drugi terminal. Aby zabić to catpolecenie (co utrudni korzystanie z drugiego terminala), naciśnij Ctrl+ C.
Pisanie na innym terminalu jest czasami przydatne do wyświetlenia powiadomienia; na przykład writepolecenie to robi. Odczytywanie z innego terminala zwykle nie jest wykonywane.
straceprogram czytać dane wejściowe, ale to wszystko.
tostopustawiona 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ź.
readwywołanie zwróci tylko kolejne znaki (a raczej bajty, powinienem powiedzieć), ale aplikacja nie ma kontroli nad tym, ile bajtów readzwróci wywołanie, więc nie jest lepiej.
Pliki w /dev/ptsto „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/0na 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 sshdi telnet, ale są również używane między emulatorem terminala (takim jak xtermlub 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/ptswę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 catz drugiej strony, ale większość tego, co wpiszesz na pts / 4, przejdzie (np. Wypróbowanie „hello world”, na którym skończyłem hlna pts / 4 i ello wordna catkonsoli).
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 stracejeś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 straceterminal GUI - jeśli nie znasz, musisz wymyślić nazwę, np. W KDE konsole, a GNOME ma gnome-terminal, jak sądzę. Wynik z tego stracejest prawdopodobnie bardziej tajemniczy - mój ma wiele poll()i recvfrom(). Nie widzę żadnych zapisów, ale jeśli teraz wyciągniesz catlewę 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.