Ctrl-s ตัวจำลองเทอร์มินัลแฮงค์?


311

ฉันเจอประโยคหนึ่งใน vimdoc:

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

และกุญแจนี้แขวนเสียงเรียกเข้าของฉัน ฉันคิดว่ามันเป็นความผิดของกลุ่มเนื่องจากไม่มีปัญหาเมื่อฉันใช้C-s/ C-x C-sใน emacs nox อย่างไรก็ตามตอนนี้เมื่อฉันอ่าน manpage และกดCtrl-sมันก็แฮงค์ได้man เช่นกัน (ฉันกำลังตั้งlessเป็น PAGER)

ดังนั้นใครบางคนสามารถบอกฉันว่าเกิดอะไรขึ้น

เทอร์มินัลอีมูเลเตอร์เป็นxtermและlxterminalและttyยังมีปัญหานี้ และ a Ctrl+ qทำให้กระบวนการถูกต้องอีกครั้งในทุกกรณี


6
นี่อาจเป็นคำถามที่โง่ แต่คุณไม่ได้พูดถึงสิ่งที่คุณได้ลองในคำถามของคุณ คุณพยายามC-qเปิดใช้งานการเลื่อนอีกครั้งใช่ไหม
h3rrmiller

3
@ h3rrmiller ใช่แล้ว แต่ฉันแค่อยากจะรู้ว่าทำไมctrl-sทำให้กระบวนการแขวน
Hongxu Chen

ก่อนที่จะมีแป้นพิมพ์ที่มีปุ่มล็อคการเลื่อนC-sและC-qเป็นวันเก่าที่ "สลับการล็อคการเลื่อน" คุณสามารถปิดการใช้งานฟังก์ชั่นนี้ได้โดยเพิ่มstty ixanyและstty ixoff -ixonไปยัง.bashrc
h3rrmiller

2
นี่คือการตั้งค่าทางประวัติศาสตร์โง่ในปัจจุบันใน terminal emulators; ดูคำถามที่เกี่ยวข้องนี้สำหรับวิธีแก้ไขเทอร์มินัลของคุณ
Ingo Karkat

1
@IngoKarkat ฉันจะไม่พูดว่ามันโง่ ... ฉันยังคงใช้มันเป็นครั้งคราว
h3rrmiller

คำตอบ:


361

ฟีเจอร์นี้เรียกว่า Software Flow Control (XON / XOFF โฟลว์คอนโทรล)

เมื่อปลายด้านหนึ่งของดาต้าลิงค์ (ในกรณีนี้เทอร์มินัลอีมูเลเตอร์) ไม่สามารถรับข้อมูลได้อีกต่อไป (เนื่องจากบัฟเฟอร์เต็มหรือใกล้เต็มหรือผู้ใช้ส่งC-s) มันจะส่ง "XOFF" เพื่อบอกจุดสิ้นสุดของการส่งข้อมูล data link เพื่อหยุดชั่วคราวจนกว่าจะได้รับสัญญาณ "XON"

สิ่งที่เกิดขึ้นภายใต้ประทุนคือ "XOFF" กำลังบอกไดรเวอร์ TTY ในเคอร์เนลเพื่อให้กระบวนการที่กำลังส่งข้อมูลเข้าสู่สถานะสลีป (เช่นหยุดภาพยนตร์ชั่วคราว) จนกระทั่งไดรเวอร์ TTY ส่ง "XON" เพื่อบอก เคอร์เนลเพื่อดำเนินการต่อกระบวนการราวกับว่ามันไม่เคยหยุดในสถานที่แรก

C-sเปิดใช้งานการล็อคเทอร์มินัลเลื่อน ซึ่งป้องกันมิให้เทอร์มินัลของคุณเลื่อน (โดยการส่งสัญญาณ "XOFF" เพื่อหยุดเอาต์พุตของซอฟต์แวร์ชั่วคราว)

C-qปิดใช้งานการล็อคการเลื่อน การเลื่อนหน้าจอต่อไปอีกครั้ง (โดยการส่งสัญญาณ "XON" เพื่อกลับสู่การทำงานของซอฟต์แวร์ต่อไป)

คุณลักษณะนี้เป็นแบบดั้งเดิม (ย้อนกลับเมื่อเทอร์มินัลช้ามากและไม่อนุญาตให้เลื่อน) และเปิดใช้งานตามค่าเริ่มต้น

การปิดใช้งานคุณลักษณะนี้คุณต้องดังต่อไปนี้อย่างใดอย่างหนึ่ง~/.bash_profileหรือ~/.bashrc:

stty -ixon

10
อันที่จริงฉันคิดว่าในที่สุดมันก็ย้อนกลับไปได้ถึงยุค 70 ถ้าไม่ใช่ยุค 60
Keith

อย่างไรก็ตามดูเหมือนว่าจะไม่ทำงานบน Ubuntu 16.04
Robert

3
"stty -ixon" <----- นี่เป็นหนึ่งในสิ่งที่สำคัญที่สุดที่ฉันได้อ่านบนอินเทอร์เน็ตในสัปดาห์ที่แล้ว ขอขอบคุณ.
แบรดพี

ที่จริงแล้วประวัติของสิ่งนี้เริ่มต้นมาหลายทศวรรษก่อนหน้า 80 ดูTTY demystified
RoboAlex

25

ในตอนท้ายของ.bashrcสคริปต์ของฉันฉันได้เพิ่ม:

#so as not to be disturbed by Ctrl-S ctrl-Q in terminals:
stty -ixon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.