วิธีส่งสัญญาณการสิ้นสุดของอินพุต stdin


82
  1. ใน Bash ฉันเรียนรู้ว่าเอกสารสิ้นสุดสามารถเปลี่ยนแปลงได้ที่นี่ แต่โดยค่าเริ่มต้นฉันจะส่งสัญญาณจุดสิ้นสุดของอินพุต stdin ได้อย่างไร
  2. ฉันบังเอิญพบว่าด้วย cat และ chardet อินพุต stdin สามารถส่งสัญญาณได้โดยกด Ctrl + d แต่ดูเหมือนว่าฉันจะจำได้ว่า Ctrl + d และ Ctrl + c คล้ายกับการสิ้นสุดการทำงานของคำสั่งที่กำลังทำงานอยู่ ดังนั้นฉันผิด

คำตอบ:


114

Ctrl+Dเมื่อพิมพ์ที่จุดเริ่มต้นของบรรทัดบนเทอร์มินัลหมายถึงจุดสิ้นสุดของอินพุต นี่ไม่ใช่สัญญาณในแง่ unix: เมื่อแอปพลิเคชันอ่านจากเทอร์มินัลและผู้ใช้กดCtrl+Dแอปพลิเคชันจะได้รับแจ้งว่าถึงจุดสิ้นสุดของไฟล์แล้ว (เช่นถ้ามันอ่านจากไฟล์และผ่าน ไบต์สุดท้าย)

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

คุณสามารถเปลี่ยนอักขระที่เกี่ยวข้องกับ end-of-file และ SIGINT ด้วยsttyคำสั่งเช่นstty eof aจะสร้างaอักขระ end-of-file และstty intr ^-จะปิดการใช้งานอักขระ SIGINT สิ่งนี้ไม่ค่อยมีประโยชน์


ขอบคุณ! ไม่Ctrl+Dได้หมายความว่า Ctrl และทุน D หรือมันไม่สำคัญ?
ทิม

5
@Tim: มันเป็นตัวพิมพ์เล็กที่คุณต้องการ ... รูปแบบของการเขียนคำสั่งแป้นพิมพ์ที่มีตัวอักษรพิมพ์ใหญ่นั้นเกิดขึ้นเพราะฉลากบนแป้นพิมพ์นั้นเป็นตัวพิมพ์ใหญ่เสมอ ใช่เรื่องนี้ทำให้สับสนในบางครั้ง
Caleb

@Caleb: ขอบคุณ! เราจะระบุได้อย่างไรว่ากุญแจอยู่ในเมืองหลวง? หรือมีกรณีเช่นนี้?
ทิม

@Tim บนเทอร์มินัลคีย์ผสมCtrl+Shift+DและCtrl+Dส่งตัวอักษรเดียวกันอยู่ดี (หมายเลขอักขระ 4 มักเรียกว่าCtrl+D)
Gilles

2
@Tim เทอร์มินัลได้รับ Ctrl + D มันไม่ได้ส่งตัวละครไปยังโปรแกรม สิ่งที่เกิดขึ้นคือเมื่อโปรแกรมอ่านจากเทอร์มินัลเครื่องจะบอกว่า“ นี่คือจุดสิ้นสุดของไฟล์” เช่นเดียวกับเมื่อโปรแกรมพยายามอ่านหลังจากสิ้นสุดไฟล์ดิสก์ เชลล์ไม่เกี่ยวข้องเลย
Gilles

23

จุดที่สองของคุณแตกต่างกันอย่างสิ้นเชิง

  • Ctrl + C ส่งสัญญาณ kill ให้กับกระบวนการที่กำลังรัน
  • Ctrl + D ส่งอักขระEnd of Transmission

คุณกำลังมองหาหลัง


7
ความเป็นไปได้ที่จะเกิดความสับสนที่นี่: จากมุมมองของแอปพลิเคชันจะไม่มีการส่งตัวอักขระใด ๆ สำหรับ ^ D ซึ่งหมายความว่าแอปพลิเคชันไม่ได้รับตัวละครนั้นจากread(2)syscall
ulidtko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.