Trong Unix, hầu hết các đối tượng bạn có thể đọc và ghi - các tệp thông thường, đường ống, thiết bị đầu cuối, ổ đĩa thô - đều được tạo ra để giống với các tệp.
Một chương trình như cat
đọc từ đầu vào tiêu chuẩn của nó như thế này:
n = read(0, buffer, 512);
yêu cầu 512 byte. n
là số byte thực sự đọc hoặc -1 nếu có lỗi.
Nếu bạn đã làm điều này nhiều lần với một tệp thông thường, bạn sẽ nhận được một loạt các lần đọc 512 byte, sau đó đọc ngắn hơn một chút ở phần đuôi của tệp, sau đó 0 nếu bạn cố đọc qua phần cuối của tệp. Vì vậy, cat
sẽ chạy cho đến khi n
<= 0.
Đọc từ một thiết bị đầu cuối là hơi khác nhau. Sau khi bạn nhập một dòng, kết thúc bằng Enterkhóa, read
chỉ trả về dòng đó.
Có một vài ký tự đặc biệt bạn có thể gõ. Một là Ctrl-D. Khi bạn nhập cái này, hệ điều hành sẽ gửi tất cả dòng hiện tại mà bạn đã nhập (chứ không phải Ctrl-Dchính nó) đến chương trình đang đọc. Và đây là điều tình cờ: nếu Ctrl-Dlà ký tự đầu tiên trên dòng, chương trình được gửi một dòng có độ dài 0 - giống như chương trình sẽ thấy nếu nó chỉ đến cuối một tệp thông thường. cat
không cần phải làm gì khác , cho dù đó là đọc từ một tệp thông thường hoặc thiết bị đầu cuối.
Một nhân vật đặc biệt khác là Ctrl-Z. Khi bạn nhập nó, bất cứ nơi nào trong một dòng, hệ điều hành sẽ loại bỏ bất cứ thứ gì bạn đã nhập cho đến thời điểm đó và gửi tín hiệu SIGTSTP đến chương trình, thường dừng (tạm dừng) nó và trả lại quyền điều khiển cho trình bao.
Vì vậy, trong ví dụ của bạn
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
bạn đã gõ một số ký tự bị loại bỏ, sau đó cat
bị dừng mà không ghi bất cứ điều gì vào tệp đầu ra của nó.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
bạn đã gõ vào một dòng, nó cat
đọc và ghi vào tệp đầu ra của nó, rồi Ctrl-Zdừng lại cat
.