Giriş-çıkış tamponlaması (IO buffering), standart kütüphane (stdio) ile birlikte C dilinde mevcuttur. Okuma ve yazma işlemlerinin performansını artırmak amacıyla uygulanmıştır, çünkü diske veya cihazlara erişim zaman açısından maliyetlidir ve tamponlama, bu erişimlerin sayısını azaltmaya yardımcı olur.
Tamponlamanın nasıl çalıştığını anlamamak, giriş-çıkışta beklenmedik gecikmelere, programın ani sonlanması sırasında veri kaybına, çoklu iş parçacıklarıyla (özellikle stdout/stderr ile) yaşanan hatalara ve süreçler veya sistemler arasında senkronizasyon hatalarına yol açabilir.
Dosya akışlarının tamamen tamponlanmış, satır başı tamponlanmış veya kesinlikle tamponlanmamış olabileceğini bilmek önemlidir; bu nedenle, tamponun zorla boşaltılması için fflush() fonksiyonlarını kullanmak, dosyaları düzgün bir şekilde kapatmak (fclose()) ve stdin, stdout ile stderr arasında akıllıca çalışmak gereklidir. Tamponlama ayrıca akışın türüne bağlıdır (örneğin, stdout bir terminal ile ilişkili akışta karakteri yazıldığında boşaltılır, ancak her zaman değil — dosya ise durum böyle değil).
Kod Örneği:
#include <stdio.h> int main() { printf("Hello"); // sleep(10); // fflush'tan önce çıktı görünmeyecek fflush(stdout); // tamponu hemen ekrana yazdırır return 0; }
Ana Özellikler:
fflush() — tamponu manuel olarak boşaltmak için ana araçtırprintf çıktısının hemen ekranda görüneceğine güvenebilir miyiz?
Hayır, eğer çıktı bir terminale değil, örneğin bir dosyaya gidiyorsa — satırlar tampon boşaltılmadığı sürece görünmeyecek veya tampon limiti aşılmayacak. Terminalde bile, olmadan bir satır hemen görünmeyebilir. Hızlı bir çıktı için fflush(stdout); kullanın.
fflush(stdin) çağrılırsa ne olur?
Bu, C standardına göre tanımsız davranış (undefined behavior) olarak kabul edilir. Bazı derleyiciler/platformlar giriş akışının tamponunu temizleyebilir, ancak bu standartla garanti edilmez ve taşınabilir olmayan ve potansiyel olarak tehlikeli bir yöntemdir.
printf ve fprintf(stderr, ...) hemen çıktı için eşdeğer kabul edilebilir mi?
Hayır. Standart çıkış (stdout) genellikle tamamen veya satır bazında tamponlanırken, stderr her zaman standart gereği güvenli olmayan bir şekilde tamponlanır. Yani, stderr'e yazılan çıktı hemen ekranda görünür, ancak stdout'ta görünmez.
fflush(stdin) kullanımıProgram, printf ile bir log dosyası yazıyor, ancak fflush(stdout) çağrısını yapmıyor ve dosyayı ani kapanma durumunda kapatmadan çıkıyor.
Artılar:
Eksiler:
Program, her önemli log kaydı sonrasında fflush(stdout) çağrısı yapıyor ya da kritik mesajları stderr'e yazıyor.
Artılar:
Eksiler: