Basitleştirilmiş açıklama
Birçok yardımcı program gibi, bu bir programa özgü bir şey olmamak grep
, standart çıktısını satır arabelleğe alınmış ve tamamen arabelleğe alınmış arasında değiştirir . Önceki durumda, C kütüphanesi, bu verileri tutan tampon dolduruluncaya veya bir satır besleme karakteri eklenene (veya program temiz bir şekilde bitene kadar) bellekte çıktı verilerini tamponlar, bunun üzerine write()
tampon içeriğini gerçekten yazmaya çağırır . İkinci durumda, yalnızca bellek içi arabellek doluyor (veya temiz bir şekilde biten program) write()
.
Daha ayrıntılı açıklama
Bu iyi bilinen ama biraz yanlış bir açıklamadır. Aslında, standart çıktı hat tamponlu değil , GNU C kütüphanesinde ve BSD C kütüphanesinde akıllı tamponludur . Standart girdinin okunması , bellek içi arabelleğini (okuma öncesi girdinin) tükettiğinde de standart çıktı temizlenir ve C kütüphanesi daha fazla girdi almak için çağırmalıdır ve yeni bir satırın başlangıcını okur. (Bunun bir nedeni, başka bir program kendini bir filtrenin her iki ucuna bağladığında ve filtreye yazma ve filtreden okuma arasında dönüşümlü olarak satır satır çalışmayı beklediğinde kilitlenmeyi önlemektir; GNU'daki "yardımcı işlemler" gibi Örneğin.)read()
awk
C kütüphanesi etkisi
grep
ve diğer yardımcı programlar bunu yapar - veya daha doğrusu, kullandıkları C kütüphaneleri bunu yapar, çünkü bu, standart çıktılarının ne olduğunu tespit ettiklerine bağlı olarak C dilinde programlamanın tanımlanmış bir özelliğidir. Etkileşimli bir aygıt değilse (ve yalnızca), tam arabelleğe almayı seçerler, aksi takdirde akıllı arabelleğe almayı seçerler. Bir kanal etkileşimli bir aygıt olarak kabul edilmez, çünkü en azından Unix ve Linux dünyasında etkileşimli bir aygıt olmanın tanımı, esasen isatty()
ilgili dosya tanımlayıcı için doğru dönen çağrıdır.
Tam arabelleğe almayı devre dışı bırakmak için geçici çözümler
Gibi bazı yardımcı programlar gördüğünüz gibi yanlış adlandırılmış bu karar değiştirmek grep
gibi kendine özgü seçenekleri vardır --line-buffered
. Ancak filtre programlarının yok olan küçük bir kısmının gerçekten böyle bir seçeneği var.
Daha genel olarak, C kütüphanesinin belirli iç kısımlarını inceleyen ve karar alma mekanizmasını değiştiren araçlar kullanılabilir (değiştirilecek program set-UID ise ve aynı zamanda belirli C kütüphanelerine özgü ise ve gerçekten de gibi programların C dili üstüne yazılmış veya katmanlı) veya araçlara özgü ptybandage
o yok etmek, programın iç görün değiştirmek ancak uçbirimsi standart çıktı olarak kararın "interaktif" olarak çıkar böylece basitçe koyulmasıyla bunu etkiler.
daha fazla okuma
cat
dosyaları birleştirir. İçine geçerek ne yapmaya çalışıyorsunuzcat
?