Mengapa konsol terkadang perlu diatur ulang setelah CTRL + C

9

Beberapa alat antarmuka baris perintah mengembalikan konsol yang rusak ketika dibatalkan oleh CTRL+C. Terkadang teks tidak terlihat, atau ada masalah grafis sampai saya menjalankan perintah reset.

(Saya menggunakan bash, tetapi berharap itu tidak tergantung pada shell.)

Apakah efek ini memiliki nama? Apa yang menyebabkan ini, dan bagaimana pemrogram dapat mencegah ini dalam alat? Apakah ada strategi bagaimana masalah ini diatasi dalam bahasa pemrograman utama?

Jonas Stein
sumber

Jawaban:

14

Konsol kadang-kadang membutuhkan reset(1) (atau beberapa stty(1)perintah) karena keadaan terminal semu tidak berubah ketika beberapa proses (misalnya program dimulai oleh shell Anda) berakhir.

Baca tty demystified .

(Saya menemukan penanganan pseudo-terminal dan pseudottys bagian tersulit dari Linux)

Apakah ada strategi bagaimana masalah ini diatasi dalam bahasa pemrograman utama?

Program berperilaku baik yang berhubungan dengan terminal dan mengubah moda atau disiplin jalurnya harus berusaha keras untuk menghindari crash dan mengeluarkan panggilan yang sesuai (lihat termios (3) ) untuk menempatkan terminal dalam keadaan yang benar. BTW, perpustakaan seperti ncurses atau readline sangat membantu (tetapi Anda perlu memanggil rutin pembersihan mereka dengan tepat).

Lihat sinyal (7) dan keamanan sinyal (7) . Menghindari menabrak kode Anda sulit. Baca tentang perilaku tidak terdefinisi .

Solusi yang tidak sempurna bisa untuk mendefinisikan fungsi shell yang menjalankan program Anda kemudian melakukan reset(yang kadang-kadang bisa tidak tepat).

Basile Starynkevitch
sumber
Penanganannya tidak bagus; terkadang resetdapat menghasilkan sttypengaturan yang berbeda dari yang asli.
Bob
Ya, terima kasih telah menunjukkannya. Saya menambahkan "tidak sempurna".
Basile Starynkevitch
Saya telah membaca tautan Anda, itu menarik, tetapi akan sangat membantu, jika Anda bisa menambahkan pointer ke bagian untuk masing-masing Tanya Jawab ini. Setelah membaca tty demystified, saya mulai stty -a > /tmp/test1di bash lalu perintah, yang saya batalkan. Warna terminal sekarang merah. stty -a > /tmp/test2tapi test1dan test2persis sama.
Jonas Stein
1

Menanggapi masalah ini tidak sepenuhnya bebas shell. Di zsh, ada ttyctlbuiltin, yang dapat "membekukan" atau "mencairkan" mode tty. Saya tidak berpikir ada yang setara di bash. The settyperintah dalam tcsh melakukan hal yang sama, tetapi lebih fine-grained: Anda dapat membekukan pengaturan individu.

Membekukan mode tty hanya berarti bahwa zsh akan mengingat mode saat ini, dan jika beberapa anak di masa depan mengubahnya, mode tersebut akan dipulihkan ketika anak ditangguhkan atau berakhir.

Ini akan melindungi Anda dari beberapa efek buruk dari program yang macet atau gagal membersihkan terminal. Anda harus ingat untuk mencairkan jika ingin melakukan perubahan stty, jika tidak, shell akan segera membatalkan apa pun yang Anda sttylakukan.

resettidak lebih dari mengembalikan sttymode, jadi Anda mungkin masih membutuhkannya kadang-kadang, tetapi tidak sering.


sumber
Memang: Saya mulai stty -a> / tmp / test1 di bash lalu sebuah perintah, yang saya batalkan. Warna terminal sekarang merah. stty -a> / tmp / test2 tetapi test1 dan test2 persis sama. Saya mencoba hal yang sama dengan tcsh, tetapi saya tidak dapat menghentikan perintah saya dengan CTRL + C. Warnanya tetap baik-baik saja.
Jonas Stein