To jest brudny świat pseudo terminali.
Lokalnie, po zmianie rozmiaru terminala pierwsza grupa procesów otrzymuje numer SIGWINCH
i można użyć ioctl
, aby pobrać nowy rozmiar. Ale co to ma wspólnego z procesem vim z zdalnym?
Temat jest dość skomplikowana, ale istotą jest to, że serwer remove (sshd) robi to:
- Otwiera główny psedoterminal urządzenia za pomocą
posix_openpt
(lub openpty
)
- Forks nowe dziecko (zazwyczaj jest związany się powłoki)
- zrywa połączenia przez zacisk za pomocą
setsid()
- otwiera urządzenie terminala (utworzonego w etapie 1), który staje się jej końcówką sterującą
- Zastępuje deskryptory Standard (
STDIN_FILENO
i przyjaciół) z fd od kroku 4
w tym momencie niczego proces serwer zapisuje na stronie głównej kończy się jako wkład do boku niewolnikiem, lecz z terminalem dyscypliny linii, więc jądro robi trochę magii - jak wysyłanie sygnałów - podczas pisania niektórych kombinacji, a także można wywoływać wywołania ioctl
z przydatnymi efektami.
Najlepszym sposobem, aby myśleć o to, aby zbadać openssh
apartament.
Monitory klienckie dla SIGWINCH
- patrz clientloop.c
i ustawia received_window_change_signal = 1
gdy odbiera go
Funkcja client_check_window_change
sprawdza, flaga i informuje serwer:
packet_start(SSH_CMSG_WINDOW_SIZE);
packet_put_int((u_int)ws.ws_row);
...
Teraz serwer powinien otrzymać pakiet, który s Określa rozmiar (potencjalnie nowy).
Serwer nazywa pty_change_window_size
z odebranym rozmiarach która robi prawdziwą magię:
struct winsize w;
w.ws_row = row;
...
(void) ioctl(ptyfd, TIOCSWINSZ, &w); /* This is it! */
To ustawia nowe okno rozmiar slave. Jeśli nowy rozmiar różni się od starego, jądro wysyła SIGWINCH
do grupy procesów na pierwszym planie związanych z tym pty. Tak więc vim
również otrzymuje ten sygnał i może zaktualizować swój pomysł rozmiaru terminala.
Dzięki, to naprawdę dobre wytłumaczenie. – fadedbee
@chrisdew Szczerze mówiąc, kiedy zapytałeś, znałem główną ideę, ale nie znałem szczegółów, więc pomyślałem, co lepiej poświęcić na jej zbadanie. – cnicutar
Dzięki za poświęcenie czasu na badania i nauczenie nas wszystkich z tym dobrym wyjaśnieniem! –