Standart C Fonksiyonlarının Kullandığı Tamponlama Teknikleri
Standart C fonksiyonları bilindiği gibi process düzeyinde (kullanıcı düzeyinde) tamponlama
yapmaktadır. Standart C fonksiyonları ve standart C’nin dosyalama mekanizması üç
tamponlama mekanizmasını kullanabilecek biçimde tasarlanmıştır.
1) Tam tamponlama (Full buffering)
2) Satır tamponlama (Line buffering)
3) Tamponlama yok (No buffering)
Tam tamponlama normal bilinen tamponlama sistemidir. Yani belirli bir büyüklükte tampon
alınır. Yazma fonksiyonları önce tampona yazar. Tampon dolmuşsa işletim sisteminin sistem
fonksiyonları çağırılarak yazma gerçekleştirilir. Okuma sırasında da önce okunacak bilginin
tamponda olup olmadığına bakılır. Tampondaysa doğrudan tampondan alınır, değilse işletim
sisteminin sistem fonksiyonları çağırılarak tampon tazelenir. Örneğin fflush fonksiyonu
tipik olarak tampondaki bilgiyi diske yazmaktadır. Kütüphaneyi yazanların kullandığı default
tampon uzunluğu stdio.h içerisinde BUFSIZ sembolik sabiti ile temsil edilir.
Satır tamponlamada tamponlama satır temelinde yapılır. Yani ‘\n’ karakteri görülene kadar
bilgi tamponda tutulur, ‘\n’ karakteri görüldüğünde tazeleme yapılır. Nihayet standart C
fonksiyonları hiç tamponlama kullanmayabilir.
environ
NULL
...
HOME = ...
PATH = ....
Peki stdin, stdout ve stderr gibi önemli dosyalar için tamponlama mekanizması default olarak
nasıldır? Standartlara göre stderr hiç bir zaman tam tamponlamaya sahip olamaz. Ancak stdin
ve stdout eğer terminal ve klavye gibi karşılıklı etkileşimli bir aygıta yönlendirilmişse tam
tamponlamaya sahip olamaz. Aynı zamanda bu dosyalar tam tamponlama içeriyorlarsa klavye
ve ekran gibi karşılıklı etkileşimli aygıtlarla ilişkili olamaz. Özetle standartlara göre stdin ve
stdout başlangıçta tam tamponlamaya sahip olamaz. Yani satır tamponlamasına sahip olabilir
ya da hiç tamponlama kullanmayabilir. Böylece örneğin printf’in içine ‘\n’ koyulursa ekrana
çıkması garantidir. Ancak uygulamada derleyicileri yazanlar genellikle stdin için satır
tamponlaması kullanırlar, stdout için ise tamponlama kullanmazlar. Böylece hemen her
derleyicide aşağıdaki yazının ekrana çıkması sağlanmaktadır.
printf(“Deneme”);
Ancak stdin, stdout ve stderr daha sonra başka aygıtlara yönlendirilebilir. Bu durumda
yönlendirilen aygıt örneğin bir dosya ise etkileşimli bir aygıt olmadığından tam tamponlama
kullanılacaktır. Popüler derleyicilerin hemen hepsi stdin için default olarak satır
tamponlaması kullanmaktadır. Yani örneğin getchar ile bir karakter almaya çalıştığımızda
enter tuşuna basılana kadar tüm satır alınır ve tamponlanır (Malesef C’de getch, kbhit gibi
standart fonksiyonlar yoktur. Ancak derleyicilerin hemen hep ek fonksiyonlar olarak çeşitli
isimlerle bulundurmaktadır. Bu fonksiyonların standart C fonksiyonlarının kullandığı tampon
fonksiyonları ile bir alakası yoktur).
Default Durum
sdtin à Satır tamponlaması ya da tamponlama yok (tam tamponlama olamaz)
stdout à Satır tamponlaması ya da tamponlama yok (tam tamponlama olamaz)
stderr à tamponlama olamaz
Yaygın durum
stdin à Satır tamponlama
stdout à Tamponlama yok
stderr à Tamponlama yok
Eğer stdin ve stdout karşılıklı etkileşimli bir aygıta yönlendirilmişse (yani dosyaya) o zaman
tam tamponlamaya sahip olmak zorundadır. stderr nereye yönlendirilirse yönlendirilsin hiç bir
zaman tam tamponlamaya sahip olmaz.