Dlaczego konsola czasami wymaga resetowania po CTRL + C

9

Niektóre narzędzia interfejsu wiersza poleceń zwracają uszkodzoną konsolę po anulowaniu przez CTRL+C. Czasami tekst jest niewidoczny lub występują problemy graficzne, dopóki nie uruchomię polecenia reset.

(Używam bash, ale spodziewam się, że jest niezależny od powłoki.)

Czy ten efekt ma nazwę? Co to powoduje i jak programiści mogą temu zapobiec w narzędziach? Czy istnieje strategia rozwiązania tego problemu w głównych językach programowania?

Jonas Stein
źródło

Odpowiedzi:

14

Konsola czasami potrzebuje reset(1) (lub jakiegoś stty(1)polecenia), ponieważ stan pseudo-terminala nie zmienia się, gdy jakiś proces (np. Program uruchomiony przez twoją powłokę) zakończy się.

Przeczytaj tty odszyfrowany .

(Uważam, że obsługa pseudo-terminali i pseudotty jest najtrudniejszą częścią Linuksa)

Czy istnieje strategia rozwiązania tego problemu w głównych językach programowania?

Dobrze wychowany program zajmujący się terminalem i zmieniający jego tryb lub dyscyplinę liniową powinien starać się unikać awarii i wydawać odpowiednie wywołania (patrz termios (3) ), aby ustawić terminal we właściwym stanie. BTW, biblioteki takie jak ncurses lub readline są pomocne (ale musisz odpowiednio wywoływać ich procedury czyszczenia).

Patrz sygnał (7) i bezpieczeństwo sygnału (7) . Unikanie awarii kodu jest trudne. Przeczytaj o niezdefiniowanym zachowaniu .

Niedoskonałym obejściem może być zdefiniowanie funkcji powłoki, która uruchamia program, a następnie wykonuje reset(co może być czasem nieodpowiednie).

Basile Starynkevitch
źródło
To obejście nie jest świetne; czasami resetmoże powodować inne sttyustawienia niż oryginalne.
Bob
Tak, dziękuję za zwrócenie na to uwagi. Dodałem „niedoskonały”.
Basile Starynkevitch
Przeczytałem twoje linki, były interesujące, ale byłoby pomocne, gdybyś mógł dodać wskaźnik do sekcji dla każdego pytania / odpowiedzi. Po przeczytaniu tty odszyfrowanego, zacząłem stty -a > /tmp/test1bash, a następnie polecenie, które anulowałem. Kolor terminala był teraz czerwony. stty -a > /tmp/test2ale test1i test2były dokładnie takie same.
Jonas Stein
1

Reakcja na ten problem nie jest całkowicie niezależna od powłoki. W Zsh jest ttyctlwbudowany, który może „zamrozić” lub „odmrozić” tryb tty. Nie sądzę, że jest odpowiednik w bash. settyKomenda w tcsh robi to samo, ale bardziej drobnoziarnisty: można zamrażać poszczególne ustawienia.

Zamrożenie trybu tty oznacza po prostu, że zsh zapamięta bieżący tryb, a jeśli jakieś przyszłe dziecko go zmieni, tryb zostanie przywrócony, gdy dziecko zawiesi się lub zakończy.

To ochroni cię przed niektórymi złymi skutkami programów, które zawieszają się lub w inny sposób nie czyszczą terminala. Musisz pamiętać o odblokowaniu, jeśli chcesz dokonać zmiany stty, w przeciwnym razie powłoka natychmiast cofnie to, co sttyzrobiłeś.

resetrobi więcej niż tylko sttytryby przywracania , więc czasem możesz go potrzebować, ale nie często.


źródło
Rzeczywiście: uruchomiłem stty -a> / tmp / test1 w bash, a następnie polecenie, które anulowałem. Kolor terminala był teraz czerwony. stty -a> / tmp / test2, ale test1 i test2 były dokładnie takie same. Próbowałem tego samego z tcsh, ale nie mogłem zawiesić polecenia za pomocą CTRL + C. Kolory pozostały w porządku.
Jonas Stein