stdin,stdout,stderr dosyaları

00:57


Windows, Unix/Linux işletim sistemlerinde STDIN, STDOUT ve STDERR birer dosya gibi ele alınmaktadır. Biz bu dosya üzerinde işlem yaparken  bu dosyalar nerelere yönlendirilmiş ise davranış biçimi o yönde olacaktır. Genel olarak stdin dosyası klavyeye yönlendirilmiştir. stdout ve stderr ise ekrana yönlendirilmiştir. Yani biz stderr veya stdout'a yazdığımız zaman bu yazılanlar ekrana çıkacak eğer stdout veya stderr yazıcıya yönlendirilmiş olsaydı o zaman yazıcıdan çıkış olacaktı. stdin dosyası genelde klavyeye yönlendirilmiştir. Dolayısıyla biz klavyeden doğrudan okuma yapmıyoruz stdin dosyasından okuma yapıyoruz ve klavye stdin dosyasına yazma yaptığı için doğrudan klavyeden okuma yaptığımızı farzederiz.Aslında işletim sisteminin stdin dosyasından okuma yapmaktayız.

Kısaca ekran sanki bir dosyadır, biz bu dosyaya yazma yaptığımızda ekrana yazmış oluruz. Klavye de bir dosya gibidir, biz bu dosyadan okuma yaptığımızda klavyeden okuma yapmış oluruz.

getchar, gets ve scanf gibi giriş fonksiyonları aslında birer dosya fonksiyonudur ve stdin dosyasından okuma yapmaktadır. printf, puts, putchar gibi fonksiyonlar da birer dosya fonksiyonudur. Default olarak stdout dosyasına yazma yapmaktadırlar.

İşletim sistemlerinde aygıtların birer dosya gibi işlem görülmesinin nedeni aygıtların kullanımı daha basite indirgemektir. Biz sadece bu dosyalarla işlem yaparken işletim sisteminin dosya alt sistemi bu dosyaların birer aygıta ilişkin olduğunu anlar ve aygıtlara yönelir. Ve bu noktada işin önemli bir kısmını işletim sistemi üzerine almış olur. UNIX türevi işletim sistemlerinde bu tasarıma Sanal Dosya Sistemi (Virtual File System) denilmektedir.

C programlama dilinde STDIN, STDOUT ve STDERR dosyaları işletim sisteminin  STDIN, STDOUT ve STDERR dosyalarıyla çalışmaktadır ama C programlama dilinde bu dosyalara erişimde tamponlama mekanizmasının kullanıldığı bilgisi akıldan çıkarılmamalıdır.

Linux shell komutlarından örnek vermek gerekirse:

komut1  >  file.txt     : komut1'in stdout'u file yönlendirilmiştir. Dolayısıyla mesela komut1 bir c programı olsaydı printf ile ekrana basmak istediğimiz karakterler dosyaya yazılacaktı.

komut1  |   komut2   : komut1'in stdout'u komut2'ye stdin olarak yönlendirilmiştir.Dolayısıyla mesela komut1 bir c programı olsaydı printf ile ekrana basmak istediğimiz karakterler ikinci c programında stdin dosyasından okuma yapılan mesela gets fonksiyonu ile alınabilecekti.