Korkarım ki anlayışınız tamamen geri. :)
"Standart giriş", "standart çıkış" ve "standart hata" değerlerini çekirdeğin perspektifinden değil , program perspektifinden düşünün .
Bir programın çıktı yazdırması gerektiğinde, normalde "standart çıkış" a yazdırır. Bir program genellikle çıktıyı standart çıkışa printf
yazdırır, SADECE standart çıkışa yazdırır.
Bir programın hata bilgilerini yazdırması gerektiğinde (istisnalar olması gerekmez, bunlar çok daha yüksek bir seviyeye yerleştirilmiş bir programlama dili yapısıdır), normalde "standart hataya" yazdırır. Normalde bunu yapar fprintf
, bu da yazdırma sırasında kullanılacak bir dosya akışını kabul eder. Standart dışı, standart hata, veya açılmış başka dosyada: Dosya akışı yazma için açılan herhangi bir dosya olabilir fopen
veya fdopen
.
dosya kullanarak giriş okumaya gerektiğinde "standart" kullanılır fread
ya fgets
ya getchar
.
Bu dosyalardan herhangi biri kabuktan kolayca şu şekilde yönlendirilebilir :
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
Veya tüm enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
İki önemli uyarı vardır: Birincisi, "standart giriş", "standart çıkış" ve "standart hata" sadece bir konudur. Bunlar çok güçlü bir konvansiyon, ama hepsi böyle programları çalıştırabilmenin çok hoş olduğu konusunda hemfikirdir: grep echo /etc/services | awk '{print $2;}' | sort
ve her programın standart çıktılarının boru hattındaki bir sonraki programın standart girdisine bağlanmasını sağlamaktır.
İkinci olarak, dosya akışları (çalışmak için standart ISO C işlevleri verdik FILE *
nesneler) - çekirdek düzeyinde, tüm dosya tanımlayıcıları (olduğu int
dosya masaya referanslar) ve çok düşük seviyeli gibi işlemler read
ve write
do not, ISO C fonksiyonlarının mutlu tamponlamasını yapın. Basit tutmayı ve daha kolay fonksiyonları kullanmayı düşündüm, ama alternatifleri bilmeniz gerektiğini düşündüm. :)