ใน Unix วัตถุส่วนใหญ่ที่คุณสามารถอ่านและเขียนได้ - ไฟล์ธรรมดา, ท่อ, เทอร์มินัล, ดิสก์ไดรฟ์ดิบ - ทั้งหมดถูกสร้างขึ้นให้มีลักษณะคล้ายกับไฟล์
โปรแกรมเช่นcat
อ่านจากอินพุตมาตรฐานเช่นนี้:
n = read(0, buffer, 512);
ซึ่งขอ 512 ไบต์ n
คือจำนวนไบต์ที่อ่านจริงหรือ -1 ถ้ามีข้อผิดพลาด
หากคุณทำสิ่งนี้ซ้ำ ๆ กับไฟล์ธรรมดาคุณจะได้รับการอ่านแบบ 512 ไบต์จากนั้นอ่านได้ค่อนข้างสั้นที่ส่วนท้ายของไฟล์จากนั้น 0 ถ้าคุณพยายามอ่านจนจบไฟล์ ดังนั้นcat
จะทำงานจนกว่าn
จะเป็น <= 0
การอ่านจากเทอร์มินัลแตกต่างกันเล็กน้อย หลังจากที่คุณพิมพ์ในบรรทัดยกเลิกโดยEnterคีย์read
ส่งกลับเพียงบรรทัดนั้น
มีอักขระพิเศษบางตัวที่คุณสามารถพิมพ์ได้ Ctrl-Dหนึ่งในนั้นคือ เมื่อคุณพิมพ์สิ่งนี้ระบบปฏิบัติการจะส่งบรรทัดปัจจุบันทั้งหมดที่คุณพิมพ์ (แต่ไม่ใช่Ctrl-Dตัวเอง) ไปยังโปรแกรมที่ทำการอ่าน และนี่คือสิ่งที่บังเอิญ: ถ้าCtrl-Dเป็นตัวอักษรตัวแรกในบรรทัดโปรแกรมจะส่งความยาว 0 บรรทัด - เหมือนกับโปรแกรมจะดูว่ามันถึงจุดสิ้นสุดของไฟล์ธรรมดาหรือไม่ cat
ไม่จำเป็นต้องทำอะไรที่แตกต่างไม่ว่าจะเป็นการอ่านจากไฟล์ธรรมดาหรือเทอร์มินัล
Ctrl-Zตัวละครอื่นเป็นพิเศษคือ เมื่อคุณพิมพ์ที่ใดก็ได้ในบรรทัดระบบปฏิบัติการจะลบสิ่งที่คุณพิมพ์จนกระทั่งถึงจุดนั้นและส่งสัญญาณ SIGTSTP ไปยังโปรแกรมซึ่งโดยปกติจะหยุด (หยุดชั่วคราว) และส่งคืนการควบคุมไปยังเชลล์
ดังนั้นในตัวอย่างของคุณ
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
คุณพิมพ์อักขระบางตัวที่ถูกละทิ้งจากนั้นcat
ก็หยุดโดยไม่ต้องเขียนอะไรลงในไฟล์เอาต์พุต
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
คุณพิมพ์ไว้ในหนึ่งบรรทัดที่cat
อ่านและเขียนไปยังแฟ้มผลลัพธ์ของมันแล้วหยุดCtrl-Zcat