ป้องกันคำสั่งไม่ให้หยุดเมื่อกด CTRL + C


28

ดังนั้นผมเล่นบาง Zork 1 และฉันไปเพื่อคัดลอกข้อความบางส่วนที่จะแสดงให้เพื่อนของฉัน แต่ฉันตั้งใจลืมที่จะกดปุ่ม Shift ค้างเมื่อกด+CTRL Cสิ่งนี้หยุดคำสั่งและฉันสูญเสียข้อมูล Zork ของฉัน ...

มีคำแนะนำ "ประโยชน์" บางอย่างที่ฉันสามารถใช้เพื่อป้องกันการหยุดคำสั่งเมื่อกดแป้นCTRL+ Cหรือไม่

โปรดทราบว่า Zork ทำงานอยู่ภายในเครื่อง มันเป็นเกมที่ใช้เทอร์มินัลที่คุณให้คำสั่งเพื่อดำเนินการต่าง


คุณต้องการให้ Ctrl + c ป้องกันการยกเลิกแอปพลิเคชันทั้งหมดพร้อมกันไหม ซึ่งอาจเป็นหายนะในอนาคตแม้ว่า
jobin

คำตอบ:


30

ชุดคีย์Ctrl+ Cส่งอักขระ^C(ค่าไบต์ 3) สิ่งนี้ทำให้เครื่องเทอร์มินัลส่งสัญญาณSIGINTไปยังโปรแกรมที่ทำงานในเบื้องหน้า¹ การดำเนินการตามปกติสำหรับสัญญาณนี้คือการขัดจังหวะคำสั่งปัจจุบัน: โปรแกรมที่ออกแบบมาเพื่อประมวลผลคำสั่งที่ต่อเนื่องกลับไปที่พรอมต์ระดับบนสุดขณะที่โปรแกรมที่ออกแบบเป็นชุดคำสั่งชุดเดียวหรือออกจากการทำงานแบบต่อเนื่อง เห็นได้ชัดว่าโปรแกรมที่คุณใช้ได้รับการออกแบบตามรุ่นที่สอง

คีย์การส่งสัญญาณนี้เป็นคุณลักษณะของอินเตอร์เฟสเทอร์มินัลทั่วไปในเคอร์เนลที่ใช้ร่วมกันโดยเทอร์มินัลอีมูเลเตอร์และเทอร์มินัลทางกายภาพจริง คุณสามารถกำหนดค่าว่าคีย์ใดจะส่งสัญญาณนี้รวมถึงคีย์อื่น ๆ (ส่วนใหญ่จะCtrlZส่งSIGSTOPเพื่อสะดุดโปรแกรมพื้นหน้า) ด้วยsttyคำสั่ง ในการสลับคีย์สำหรับ SIGINT ไปที่Ctrl+ _(ในเทอร์มินัลปัจจุบัน):

stty intr '^_'

หากต้องการปิดใช้งานทั้งหมด:

stty intr ''

หากต้องการรีเซ็ตการตั้งค่าทั้งหมดเป็นค่าเริ่มต้น:

stty sane

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

¹ อย่างแม่นยำมากขึ้นเพื่อให้กระบวนการในทุกเบื้องหน้ากระบวนการกลุ่มที่สถานีเป็นสถานีควบคุม


32

CTRL+ Cส่งสัญญาณขัดจังหวะ ( SIGINTซึ่งเป็นหมายเลขสัญญาณ 2) ไปยังงานในเบื้องหน้า คุณสามารถปิดการใช้งานได้โดย "trapping" สัญญาณโดยใช้trap '' 2คำสั่งก่อนเริ่ม Zork

เปิดใช้งานCTRL+ C(untrap SIGINT) trap 2อีกครั้งด้วย

เคล็ดลับ : คุณสามารถเพิ่มสิ่งนี้ในของคุณ~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

วิธีนี้คุณจะไม่มีวันลืมที่จะปิดการใช้งานและเปิดใช้งานสัญญาณอีกครั้งและมันง่ายกว่าที่จะเริ่มเกมโดยเพียงแค่พิมพ์zorkเทอร์มินัล

หมายเหตุ : คุณสามารถใช้ชื่อสัญญาณแทนหมายเลขถ้ามันสะดวกมากขึ้นสำหรับคุณคือหรือtrap '' sigint trap '' intฉันเพิ่งคุ้นเคยกับการใช้ตัวเลขเช่นในkill -9และเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.