ทำไมบางครั้งคอนโซลจำเป็นต้องมีการรีเซ็ตหลังจาก CTRL + C


9

CTRL+Cบางเครื่องมือติดต่อบรรทัดคำสั่งกลับคอนโซลเสียเมื่อยกเลิกโดย resetบางครั้งข้อความที่มองไม่เห็นหรือมีปัญหากราฟิกจนกว่าฉันจะเรียกใช้คำสั่ง

(ฉันใช้ bash แต่คาดว่าจะเป็นอิสระจากเชลล์)

ผลกระทบนี้มีชื่อหรือไม่? อะไรทำให้เกิดสิ่งนี้และโปรแกรมเมอร์สามารถป้องกันสิ่งนี้ในเครื่องมือได้อย่างไร มีกลยุทธ์ที่จะแก้ปัญหานี้ในภาษาการเขียนโปรแกรมหลักหรือไม่?


คำถามที่เกี่ยวข้องคือunix.stackexchange.com/questions/401010 , unix.stackexchange.com/questions/79684 , unix.stackexchange.com/questions/164944 , unix.stackexchange.com/questions/282514และunix.stackexchange.com/ คำถาม / 398291เพียงเพื่อเริ่ม ดูเพิ่มเติมsuperuser.com/questions/1259442
JdeBP

stty saneสำหรับเคราสีเทา
Thorbjørn Ravn Andersen

คำตอบ:


14

บางครั้งคอนโซลจำเป็นต้องมีreset(1) (หรือstty(1)คำสั่งบางอย่าง) เนื่องจากสถานะของเทอร์มินัลหลอกไม่เปลี่ยนแปลงเมื่อกระบวนการบางอย่าง (เช่นโปรแกรมที่เริ่มโดยเชลล์ของคุณ) ถูกยกเลิก

อ่านTTY demystified

(ฉันพบว่าการจัดการเทอร์มินัลเทียมและหลอกเป็นส่วนที่ยากที่สุดของ Linux)

มีกลยุทธ์ที่จะแก้ปัญหานี้ในภาษาการเขียนโปรแกรมหลักหรือไม่?

โปรแกรมที่มีความประพฤติดีจัดการกับเครื่องเทอร์มินัลและการเปลี่ยนโหมดหรือระเบียบวินัยของสายควรพยายามอย่างหนักเพื่อหลีกเลี่ยงการหยุดทำงานและออกสายที่เหมาะสม (ดูtermios (3) ) เพื่อทำให้เครื่องอยู่ในสถานะที่ถูกต้อง BTW ไลบรารีเช่นncursesหรือreadlineมีประโยชน์ (แต่คุณต้องเรียกรูทีนการล้างข้อมูลอย่างเหมาะสม)

ดูสัญญาณ (7)และสัญญาณความปลอดภัย (7) หลีกเลี่ยงการหยุดทำงานในรหัสของคุณเป็นเรื่องยาก อ่านข้อมูลเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนด

วิธีแก้ปัญหาที่ไม่สมบูรณ์อาจเป็นการกำหนดฟังก์ชันเชลล์ซึ่งเรียกใช้โปรแกรมของคุณจากนั้นทำreset(ซึ่งบางครั้งอาจไม่เหมาะสม)


วิธีแก้ปัญหานั้นไม่ดีนัก บางครั้งresetอาจทำให้sttyการตั้งค่าที่แตกต่างจากเดิม
บ๊อบ

ใช่ขอบคุณที่ชี้ให้เห็น ฉันเพิ่ม "ไม่สมบูรณ์"
Basile Starynkevitch

ฉันได้อ่านลิงก์ของคุณแล้วพวกเขาน่าสนใจ แต่มันจะเป็นประโยชน์ถ้าคุณสามารถเพิ่มตัวชี้ไปยังส่วนสำหรับ Q / A นี้ได้ หลังจากอ่าน tty demystified ฉันเริ่มstty -a > /tmp/test1ทุบตีแล้วคำสั่งซึ่งฉันยกเลิก สีเทอร์มินัลเป็นสีแดง stty -a > /tmp/test2แต่test1และtest2ก็เหมือนกันทุกประการ
Jonas Stein

1

การตอบสนองต่อปัญหานี้ไม่ได้แยกเปลือกอย่างสมบูรณ์ ใน zsh มีttyctlbuiltin ซึ่งสามารถ "หยุด" หรือ "ยกเลิกการตรึง" โหมด tty ได้ ฉันไม่คิดว่าจะมีการทุบตีเท่ากัน settyคำสั่งใน tcsh จะเป็นสิ่งเดียวกัน แต่มีรายละเอียดเพิ่มเติม: คุณสามารถหยุดการตั้งค่าของแต่ละบุคคล

การแช่แข็งโหมด tty นั้นหมายถึงว่า zsh จะจดจำโหมดปัจจุบันและหากเด็กในอนาคตมีการเปลี่ยนแปลงโหมดนั้นจะถูกเรียกคืนเมื่อเด็กหยุดชั่วคราวหรือยกเลิก

สิ่งนี้จะช่วยปกป้องคุณจากผลกระทบที่ไม่ดีบางประการของโปรแกรมที่ผิดพลาดหรือไม่สามารถทำความสะอาดเครื่องได้ คุณต้องอย่าลืมทำน้ำแข็งให้ละลายถ้าคุณต้องการเปลี่ยนแปลงด้วยsttyไม่เช่นนั้นเชลล์จะยกเลิกสิ่งที่คุณsttyทำทันที

resetทำมากกว่าsttyโหมดกู้คืนดังนั้นคุณยังอาจจำเป็นต้องใช้ในบางครั้ง แต่ไม่บ่อยนัก


แน่นอน: ฉันเริ่ม stty -a> / tmp / test1 ใน bash แล้วคำสั่งซึ่งฉันยกเลิก สีเทอร์มินัลเป็นสีแดง stty -a> / tmp / test2 แต่ test1 และ test2 เหมือนกันทุกประการ ฉันลองแบบเดียวกันกับ tcsh แต่ฉันไม่สามารถทำผิดพลาดคำสั่งของฉันด้วย CTRL + C สียังคงดี
Jonas Stein
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.