2016-04-12 13 views
0

cat komutunun çıktısının tamamen arabelleğe alındığı bir satıra rastladım. Bu ne demek?Tam olarak tamponlanmış, çizgi arabelleğe alınmış ve arabelleğe alınmamış C cinsinden ortalama nedir?

+3

Favori arama motorunuza gidin ve orada arayın. Binlerce iyi cevap alacaksın. –

+0

^^ emin, ancak diğer öğrenciler zaten ilk sayfanın tüm iyi cevapları intihal etmiş olacak. Bu gibi mesajlar, OP'nin teslim edilmesi için eşsiz bir cevap istemeye yöneliktir. –

+0

@MartinJames - cynic çok mu? ;) – KevinDTimm

cevap

2

Online C11 standard:

bir dere tamponsuz olduğu, karakterler kısa sürede kaynağından veya varış yerinde görünmesi için tasarlanmıştır. Aksi halde karakterler biriktirilebilmekte ve konak ortamına bir blok olarak aktarılabilmektedir. Bir akış tam olarak arabelleğe alındığında, bir arabellek dolduğunda karakterlerin ana makine ortamına bir veya bir blok olarak iletilmesi amaçlanır. Bir akış satır arabelleği olduğunda, karakterlerin yeni satır karakteriyle karşılaşıldığında ana bilgisayar ortamına veya bir blok olarak iletilmesi amaçlanır. Ayrıca, bir tampon doldurulduğunda, arabelleğe alınmamış bir akışta giriş istendiğinde veya ana bilgisayar ortamından karakterlerin iletilmesini gerektiren bir satır tamponlu akışta giriş istendiğinde, karakterlerin ana bilgisayar ortamına bir blok olarak iletilmesi amaçlanır. . Bu özellikler için destek, uygulama tanımlıdır ve setbuf ve setvbuf işlevleri aracılığıyla etkilenebilir.

7.21.3/7: Program Başlangıçta

, üç metin akışları önceden tanımlanmış olan ve açıkça açılacak gerekmez - (konvansiyonel girişi okumak için) standart girdi, standart çıktı (Geleneksel çıktı yazmak için) ve standart hatası (tanısal çıktı yazmak için). Başlangıçta açıldığı gibi, standart hata akışı tam olarak tamponlanmamıştır; standart giriş ve standart çıkış akımları, sadece ve eğer akış bir interaktif cihaza atıfta bulunulmayacağı belirlenirse tamamen tamponlanır.

1

Çözülmemiş çıkış, giriş dosyasındaki baytları, her biri okunduğunda, gecikme olmadan standart çıkışına yazar. o tampon içinde ve depolar okumak ve bunu önlemek için -u seçeneği ile tek onun yapılır bulunuyor tampon ..

gösterilecek olarak

Tam tamponlu çıktı ilk dizideki tam dosyasını okur.

1

[Örneklerde Perl'i özlü ve yeniden üretme kolaylığı için kullanıyorum, fakat benim çizdiğim kavramlar Perl'e özgü değil. C aynı şekilde çalışır.]

Arabellekleme, bir dosya tanıtıcısına yazılan nesnelerin OS'ye ne sıklıkla boşaltıldığını (gönderilmesini) belirler. Aşağıdaki iki komutların davranışını karşılaştırın:

# Without buffering 
perl -e'$|=0; print "a"; sleep(2); print "b\n";' 

# With buffering 
perl -e'$|=1; print "a"; sleep(2); print "b\n";' 

Normalde, tampon dolduğunda sadece aktarılmadan. Satır arabellekli çıktı da yeni satırla karşılaşıldığında temizlenir. Karşılaştırma: Çoğu program blok-arabelleğe almayı kullanır. Ancak, genellikle bir terminale bağlandığında stdout için satır ara belleğe geçerler. Karşılaştırma: 7.21.3/3

# Perl's STDOUT is line-buffered when connected to a terminal. 
perl -e'print "a\n"; sleep(2); print "b\n";' 

# Perl's STDOUT is fully buffered when connected to a pipe. 
perl -e'print "a\n"; sleep(2); print "b\n";' | cat 

# unbuffer uses pseudo-ttys to fool a program into thinking it's connected to a terminal. 
unbuffer perl -e'print "a\n"; sleep(2); print "b\n";' | cat 
İlgili konular