UNIX/Linux ve Windows Sistemlerinde stdin, stdout ve stderr Dosyaları | C ve Sistem Programcıları Derneği
27.04.2010 - 16:39 tarihinde aslank gönderdi
UNIX/Linux sistemlerinde stdin, stdout ve stderr dosyalarına ilişkin betimleyiciler fork işlemi sıarsında üst prosesten aktarılmaktadır. Yani zaten üst proseste bu dosyalar açık durumdadır. exec işlemleri sırasında da bu betimleyiciler kapatılmaz. Pekiyi stdin, stdout ve stderr dosyaları ilk kez hangi proses tarafından açılmıştır? Hikayeyi biraz geriden alarak açıklamaya çalışalım. UNIX türevi bir sisteme terminal yoluyla giriş yapılmak istendiğinde init prosesinden hareketle bir dizi işlem gerçekleştirilmektedir. Tipik olarak init prosesi fork ve exec fonksiyonlarını uygulayarak getty isimli bir programı çalıştırır. init prosesinin etkin kullanıcı id’si 1 olduğu için getty prosesinin de 1 olacaktır. Daha sonra getty prosesi terminale ilişkin aygıt dosyasını open fonksiyonuyla önce okuma modunda sonra yazma modunda açar ve yazma modunda açtığı betimleyiciye dup fonksiyonunu uygular. Böylece stdin, stdout ve stderr betimleyicileri oluşturulmuş olur. Bu betimleyiciler alt proseslere aktarılacaktır.
5. exec fonksiyonları ile "/etc/passwd" dosyasında belirtilen programı çalıştırır. (örneğimizde "/bin/bash")
Bilindiği gibi Windows sistemlerinde proses tablosu EPROCESS (Executive Process) yapısıyla temsil edilmektedir. Bu sistemlerde betimleyici (descriptor) terimi yerine handle terimi kullanılır ve yalnızca dosyaların değil tüm çekirdek nesnelerinin (kernel objects) birer handle değeri vardır. Açılmış çekirdek nesnelerinin adresleri Proses Handle Tablosu (Process Handle Table) denilen bir listede doğrudan ya da dolaylı olarak tutulmaktadır. Handle değerleri tıpkı UNIX/Linux sistemlerinde olduğu gibi prosesin handle tablosunda birer indeks belirtir. Aşağıda ReactOS sistemlerindeki konu ile ilgili veri yapısını veriyoruz. Çekirdek veri yapısının Windows sistemlerindeki tasarımı ile ReactOS sistemlerindeki tasarımının birbirine çok benzer olduğunu vurgulayalım. ReactOS kaynak kodları gerçek Windows sistemleri hakkında bize oldukça iyi bir fikir verebilmektedir:
Burada EPROCESS yapısı proses tablosunu, PEB yapısı prosesin ikincil bilgilerinin saklandığı prosesin çevresel bloğunu temsil ediyor. HANDLE_TABLE yapısının Tables isimli elemanı HANDLE_TABLE_ENTRY ** türündendir. Yani bu eleman bir gösterici dizisini göstermektedir. İşte çekirdek nesnelerinin handle değerleri de bu gösterici dizisinde bir indeks belirtirler. HANDLE_TABLE_ENTRY ise çekirdek nesnelerine ilişkin çeşitli açış ve erişim haklarını içeren bir yapıdır. Şeklin aşağısında örnek bir handle değeri verdik. Windows sistemlerindeki handle değerlerinin -HANDLE bir adres türü olsa da- aslında bir indeks belirttiğine dikkat ediniz. Ayrıca Windows sistemlerinde stdin, stdout ve stderr dosyalarına ilişkin handle değerlerinin UNIX/Linux sistemlerinde olduğu gibi önceden bilinen ve değişmez değerler olmadığını da söyleyelim. Bu nedenle stdin, stdout ve stderr handle değerlerinin proses tablosu yoluyla erişilebilen bir alanda tutulması uygun görülmüştür. Yukarıdaki şekilden de gördüğünüz gibi ReactOS’ta stdin, stdout ve stderr dosyalarına ilişkin handle değerleri PEB yapısının ProcessParameters elemanının gösterdiği yapıda tutulmaktadır. Microsoft belirli bir zamandan sonra Windows sistemlerinde handle tablosunu 3 kademeli hale getirmiştir. Bu 3 kademeli handle tablosu X86 sistemlerindeki sayfalama mekanizmasındaki sayfa dizini (page directory) ve sayfa tablosu (page table) tasarımına benzemektedir.
4. Mauerer W. (2008). Professional Linux Kernel Architecture. Wiley Publishing, Inc: Indianapolis