Ctrl-s hang terminal emulator?

311

Saya menemukan sebuah kalimat di vimdoc:

Note: CTRL-S does not work on all terminals and might block
                further input, use CTRL-Q to get going again.

dan kunci ini memang menggantung vim saya. Saya berpikir bahwa itu adalah kesalahan vim, karena tidak ada masalah ketika saya menggunakan C-s/ C-x C-sdi emacs nox. Namun baru saja ketika saya membaca halaman manual dan menekan Ctrl-s, itu hang man juga (saya menetapkan lesssebagai PAGER).

Jadi bisakah seseorang memberi tahu saya apa yang terjadi?

Emulator terminal adalah xtermdan lxterminal, dan ttyjuga memiliki masalah ini. Dan tanda Ctrl+ qmenempatkan proses kembali dengan benar dalam semua kasus.

Hongxu Chen
sumber
6
Ini mungkin pertanyaan bodoh tapi Anda tidak menyebutkan apa yang Anda coba dalam pertanyaan Anda. Anda mencoba C-qmengaktifkan kembali pengguliran, bukan?
h3rrmiller
3
@ h3rrmiller ya, itu benar. Tetapi saya hanya ingin tahu mengapa ctrl-smenyebabkan proses untuk menggantung.
Hongxu Chen
sebelum ada keyboard dengan tombol gulir kunci C-sdan C-qdulu "gulir kunci beralih". Anda dapat menonaktifkan fungsi ini dengan menambahkan stty ixanydan stty ixoff -ixonke.bashrc
h3rrmiller
2
Ini adalah pengaturan historis bodoh saat ini dalam emulator terminal; lihat pertanyaan terkait ini untuk cara memperbaiki terminal Anda.
Ingo Karkat
1
@IngoKarkat Saya tidak akan mengatakan itu bodoh ... Saya masih menggunakannya dari waktu ke waktu
h3rrmiller

Jawaban:

361

Fitur ini disebut Software Flow Control (kontrol aliran XON / XOFF)

Ketika salah satu ujung tautan data (dalam hal ini terminal emulator) tidak dapat menerima data lagi (karena buffer penuh atau hampir penuh atau pengguna mengirim C-s) itu akan mengirim "XOFF" untuk memberi tahu akhir pengiriman tautan data untuk berhenti sementara sampai sinyal "XON" diterima.

Apa yang terjadi di bawah tenda adalah "XOFF" memberi tahu driver TTY di kernel untuk menempatkan proses yang mengirim data ke kondisi tidur (seperti menjeda film) sampai driver TTY dikirim "XON" untuk memberitahu kernel untuk melanjutkan proses seolah-olah tidak pernah berhenti di tempat pertama.

C-smengaktifkan kunci gulir terminal. Yang mencegah terminal Anda dari bergulir (Dengan mengirim sinyal "XOFF" untuk menjeda output perangkat lunak).

C-qmenonaktifkan kunci gulir. Melanjutkan pengguliran terminal (Dengan mengirim sinyal "XON" untuk melanjutkan output perangkat lunak).

Fitur ini adalah warisan (kembali ketika terminal sangat lambat dan tidak memungkinkan pengguliran) dan diaktifkan secara default.

Untuk menonaktifkan fitur ini, Anda memerlukan yang berikut di salah satu ~/.bash_profileatau ~/.bashrc:

stty -ixon
h3rrmiller
sumber
10
Sebenarnya saya pikir akhirnya mencapai 70-an, jika tidak 60-an.
Keith
Namun sepertinya tidak berfungsi di Ubuntu 16.04.
Robert
3
"stty -ixon" <----- ini adalah salah satu hal paling penting yang saya baca di internet minggu lalu. Terima kasih.
Brad P.
Sebenarnya, sejarah ini dimulai beberapa dekade lebih awal dari 80-an. Lihat TTY yang didemistifikasi .
RoboAlex
25

Di akhir .bashrcskrip saya, saya telah menambahkan:

#so as not to be disturbed by Ctrl-S ctrl-Q in terminals:
stty -ixon
Stephane Rolland
sumber