ใครเป็นผู้ตัดสินใจว่าแอปพลิเคชันใดที่รับสัญญาณจากแป้นพิมพ์


16

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

  • ผู้ใช้กด Cc
  • สิ่งนี้ถูกส่งไปยังอินพุตบัฟเฟอร์ของเทอร์มินัลเป็นไบต์ซึ่งคำนวณโดยการล้าง 2 บิตซ้ายสุดจากค่า 7 บิต ascii ของ c

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

การส่งสัญญาณโดยคีย์บอร์ดในเทอร์มินัลทำงานอย่างไรตั้งแต่ต้นจนจบ


1
ไม่ใช่คำตอบของตัวเอง แต่ควรอ่านค่า: TTY demystifiedโดย lft
duskwuff

คำตอบ:


33

การกด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) (ซอฟต์แวร์ด้านหลักด้านทาส)


2
ขอบคุณสำหรับคำตอบมากมาย ฉันจะพยายามเรียบเรียงแกนกลางของคำตอบเพื่อให้แน่ใจว่าฉันเข้าใจ: สัญญาณถูกส่งโดยเคอร์เนลซึ่งกำลังตรวจสอบอุปกรณ์ tty เองสำหรับอินพุตที่กำหนดค่าในแอตทริบิวต์ของอุปกรณ์ (โดยใครก็ตามที่ต้องการกำหนดค่า) และเคอร์เนลส่งไปยังกลุ่มกระบวนการซึ่งมีการกำหนดค่าในคุณสมบัติของอุปกรณ์ (ส่วนใหญ่โดยเชลล์เป็นหนึ่งในหน้าที่ของผู้นำเซสชัน) ฉันหวังว่านี่ถูกต้อง
calavera.info

1
@ calavera.info ใช่ถูกต้อง ในกรณีของเทอร์มินัลจริงในตอนท้ายของสายเคเบิลอนุกรมเคอร์เนลกำลังค้นหา 0x3 ไบต์ที่มาจากสาย สำหรับเทอร์มินัลเทียมด้านต้นแบบจะแทนที่ลวด และเคอร์เนลกำลังค้นหา 0x3 ไบต์ในไบต์ที่ส่งโดยเทอร์มินัลอีมูเลเตอร์ ดูการแก้ไขพร้อมลิงก์ไปยังคำถาม & คำตอบอื่น ๆ ที่มีรายละเอียดเพิ่มเติม (เช่นข้อเท็จจริงที่ว่าการประมวลผลเคอร์เนลเป็นส่วนหนึ่งของการออกแบบแบบแยกส่วนซึ่งทำเมื่อใช้อุปกรณ์เป็นอุปกรณ์ "เทอร์มินัล" ( วินัยบรรทัดเทอร์มินัล)
Stéphane Chazelas

ไม่ได้บอกว่าคำถามที่ขั้วมากกว่าจำลอง terminal ? ฉันไม่คิดว่ามันจะสร้างความแตกต่างมากนักเนื่องจากฟังก์ชั่นอีมูเลเตอร์ทำหน้าที่เหมือนเทอร์มินัลให้มากที่สุด ...
Toby Speight

2
@Toby ใช่เพราะแทบไม่มีใครใช้เทอร์มินัลจริงวันนี้ฉันจึงสันนิษฐานว่า OP หมายถึงเทอร์มินัลอีมูเลเตอร์ (หลายคนเรียกว่า "เทอร์มินัล") ดูความคิดเห็นของฉันด้านบนของคุณและคำถามและคำตอบที่เชื่อมโยงเพื่อดูรายละเอียดเพิ่มเติม
Stéphane Chazelas

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