การกดCในขณะที่Ctrlกดจะส่งการกดปุ่มตามด้วยเหตุการณ์ keyrelease X11 ไปยังเทอร์มินัลอีมูเลเตอร์
ในเหตุการณ์นั้น (โดยทั่วไปคือปุ่มกดหนึ่งตัว) เทอร์มินัลอีมูเลเตอร์เขียน 0x3 ไบต์ ( ^C
) ลงในไฟล์ descriptor ของมันที่ด้านหลักของอุปกรณ์ pseudo-tty
หากการisig
ตั้งค่า termios ของอุปกรณ์เปิดอยู่และหากการintr
ตั้งค่าถูกตั้งค่าเป็น 0x3 ไบต์เคอร์เนลจะส่งสัญญาณ SIGINT ไปยังสมาชิกทั้งหมดของกลุ่มกระบวนการทำงานเบื้องหน้าของอุปกรณ์เทอร์มินัล (คุณลักษณะอื่นที่เก็บไว้ในอุปกรณ์ pty) ในกรณีดังกล่าวไบต์ 0x3 จะไม่สามารถอ่านได้บนด้านทาสของ pty
โดยปกติแล้วเชลล์แบบโต้ตอบที่สร้างกลุ่มกระบวนการ (พร้อมsetpgid()
) สำหรับงานเชลล์และตัดสินใจว่าจะใส่อันใดไว้ด้านหน้า (ด้วย)tcsetpgrp()
การตั้งค่าคุณลักษณะของอุปกรณ์ pty) หรือไม่
ตัวอย่างเช่นเมื่อคุณรันที่พร้อมต์ของเชลล์แบบโต้ตอบ:
foo | bar
เชลล์เริ่มกลุ่มกระบวนการใหม่ที่มีสองกระบวนการ (ซึ่งจะดำเนินการ foo
และbar
หลังจากเชื่อมต่อ stdin / out ด้วยไพพ์) และทำให้กลุ่มนั้นอยู่เบื้องหน้า กระบวนการทั้งสองจะได้รับ SIGINT หากคุณกด Ctrl-C
ใน:
foo | bar &
เหมือนกัน แต่กลุ่มกระบวนการไม่ได้อยู่ด้านหน้า (และเชลล์ก็ไม่รอให้คุณสามารถป้อนคำสั่งอื่น ๆ ) กระบวนการเหล่านั้นจะไม่ได้รับ SIGINT เมื่อกดปุ่ม Ctrl-C แต่อาจถูกระงับหากพวกเขาพยายามอ่านจากอุปกรณ์ tty
อ่านเพิ่มเติมที่: อะไรคือความรับผิดชอบของแต่ละองค์ประกอบ Pseudo-Terminal (PTY) (ซอฟต์แวร์ด้านหลักด้านทาส)