Ctrl-s treo trình giả lập thiết bị đầu cuối?


311

Tôi bắt gặp một câu trong vimdoc:

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

và chìa khóa này thực sự treo vim của tôi. Tôi đã nghĩ rằng đó là lỗi của vim, vì không có vấn đề gì khi tôi sử dụng C-s/ C-x C-strong emacs nox. Tuy nhiên, ngay lúc tôi đang đọc một trang và nhấn Ctrl-snó, nó cũng bị treo man (tôi đang đặt lesslàm PAGER).

Vì vậy, ai đó có thể cho tôi biết những gì đang xảy ra?

Các giả lập thiết bị đầu cuối là xtermlxterminal, và ttycũng có vấn đề này. Và một Ctrl+ qđặt quá trình lại một lần nữa trong tất cả các trường hợp.


6
Đây có thể là một câu hỏi ngu ngốc nhưng bạn đã không đề cập đến những gì bạn đã cố gắng trong câu hỏi của bạn. Bạn đã thử C-qkích hoạt lại cuộn, phải không?
h3rrmiller

3
@ h3rrmiller vâng, đúng vậy. Nhưng tôi chỉ muốn biết tại sao ctrl-sgây ra quá trình treo.
Hongxu Chen

trước đây đã có bàn phím với phím khóa cuộn C-sC-qngày xưa là "chuyển khóa khóa". bạn có thể tắt chức năng này bằng cách thêm stty ixanystty ixoff -ixonvào.bashrc
h3rrmiller

2
Đây là một bối cảnh lịch sử ngu ngốc ngày nay trong các trình giả lập thiết bị đầu cuối; xem câu hỏi liên quan này để biết cách khắc phục thiết bị đầu cuối của bạn.
Ingo Karkat

1
@IngoKarkat Tôi sẽ không nói điều đó thật ngu ngốc ... Tôi vẫn
thỉnh thoảng

Câu trả lời:


361

Tính năng này được gọi là Điều khiển luồng phần mềm (Điều khiển luồng XON / XOFF)

Khi một đầu của liên kết dữ liệu (trong trường hợp này, trình giả lập thiết bị đầu cuối) không thể nhận thêm bất kỳ dữ liệu nào (vì bộ đệm đã đầy hoặc gần đầy hoặc người dùng gửi C-s), nó sẽ gửi "XOFF" để báo cho kết thúc gửi của liên kết dữ liệu để tạm dừng cho đến khi nhận được tín hiệu "XON".

Điều đang xảy ra dưới mui xe là "XOFF" đang nói với trình điều khiển TTY trong kernel để đưa quy trình gửi dữ liệu về trạng thái ngủ (như tạm dừng phim) cho đến khi trình điều khiển TTY được gửi "XON" để báo cho kernel để tiếp tục quá trình như thể nó không bao giờ dừng lại ở nơi đầu tiên.

C-scho phép khóa cuộn thiết bị đầu cuối. Điều này ngăn thiết bị đầu cuối của bạn cuộn (Bằng cách gửi tín hiệu "XOFF" để tạm dừng đầu ra của phần mềm).

C-qvô hiệu hóa khóa cuộn. Tiếp tục cuộn thiết bị đầu cuối (Bằng cách gửi tín hiệu "XON" để tiếp tục đầu ra của phần mềm).

Tính năng này là di sản (trở lại khi thiết bị đầu cuối rất chậm và không cho phép cuộn) và được bật theo mặc định.

Để tắt tính năng này, bạn cần điều sau đây trong một trong hai ~/.bash_profilehoặc ~/.bashrc:

stty -ixon

10
Thật ra tôi nghĩ nó cuối cùng đã lùi xa đến thập niên 70, nếu không phải là thập niên 60.
Keith

Tuy nhiên, nó dường như không hoạt động trên Ubuntu 16.04.
Robert

3
"stty -ixon" <----- đây là một trong những điều quan trọng nhất tôi đã đọc trên internet trong tuần qua. cảm ơn bạn.
Brad P.

Trên thực tế, lịch sử của điều này bắt đầu vài thập kỷ sớm hơn 80. Xem TTY làm sáng tỏ .
RoboAlex

25

Vào cuối .bashrckịch bản của tôi, tôi đã thêm:

#so as not to be disturbed by Ctrl-S ctrl-Q in terminals:
stty -ixon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.