Tôi sợ sự hiểu biết của bạn là hoàn toàn lạc hậu. :)
Hãy nghĩ về "tiêu chuẩn trong", "tiêu chuẩn ra" và "lỗi tiêu chuẩn" từ quan điểm của chương trình , không phải từ quan điểm của hạt nhân.
Khi một chương trình cần in đầu ra, nó thường in thành "tiêu chuẩn ra". Một chương trình thường in đầu ra ra theo tiêu chuẩn printf
, in ra CHỈ theo tiêu chuẩn.
Khi một chương trình cần in thông tin lỗi (không nhất thiết là ngoại lệ, đó là cấu trúc ngôn ngữ lập trình, được áp đặt ở mức cao hơn nhiều), nó thường in thành "lỗi tiêu chuẩn". Nó thường làm như vậy với fprintf
, chấp nhận một luồng tệp để sử dụng khi in. Luồng tệp có thể là bất kỳ tệp nào được mở để ghi: lỗi tiêu chuẩn, lỗi tiêu chuẩn hoặc bất kỳ tệp nào khác đã được mở bằng fopen
hoặc fdopen
.
"Standard in" được sử dụng khi tệp cần đọc đầu vào, sử dụng fread
hoặc fgets
, hoặc getchar
.
Bất kỳ tệp nào trong số này có thể dễ dàng được chuyển hướng từ trình bao, như thế này:
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
Hoặc, toàn bộ enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Có hai cảnh báo quan trọng: Thứ nhất, "tiêu chuẩn trong", "tiêu chuẩn ra" và "lỗi tiêu chuẩn" chỉ là một quy ước. Chúng là một quy ước rất mạnh , nhưng tất cả chỉ là một thỏa thuận rằng thật tuyệt khi có thể chạy các chương trình như thế này:grep echo /etc/services | awk '{print $2;}' | sort
và có đầu ra tiêu chuẩn của mỗi chương trình được nối vào đầu vào tiêu chuẩn của chương trình tiếp theo.
Thứ hai, tôi đã đưa cho các chức năng ISO C tiêu chuẩn để làm việc với các dòng tập tin ( FILE *
đối tượng) - ở cấp hạt nhân, đó là tất cả các file descriptor ( int
tham chiếu đến bảng tập tin) và nhiều hoạt động thấp cấp như read
và write
, mà không làm bộ đệm hạnh phúc của các chức năng ISO C. Tôi đã tìm cách giữ cho nó đơn giản và sử dụng các chức năng dễ dàng hơn, nhưng tôi nghĩ tất cả giống như bạn nên biết các lựa chọn thay thế. :)