Sistem fonksiyonlarıdönüşdeğerleri alınmadan bir şey ifade etmeyecektir.Dosya açtığımızda dosya numarasıdönmesi , okuma işleminde okunan byte sayısıvb.
Ek olarak sistem bir hata olduğunda bize bildirmelidir : Bir dosya yok ise , sistem kaynaklarıyetersiz ise , yanlışparametre gönderildiğinde gibi
Çok eskilerden beri Unix sistemleri altında sistem çağrıları hakkında bilgi kaynağıkullanım (manual) sayfalarıdır. Bunlara man komutu ile ulalışılabilmesinden ötürü man pages olarak adlandırılır.FreeBSD man sayfalarısistem çağrılarını2. yada 3. bölümde açıklamaktadır.
Mesela open(2) man sayfasından :
If successful,
open()returns a non-negative integer, termed a file descriptor. It returns -1 on failure, and sets errno to indicate the error.
Assembly programcısıeğer Unix ve FreeBSD dünyasında yeni ise şu soruyu soracaktır :
errnonerede , nasıl ulaşabilirim ?
Not: Man sayfalarındaki gösterilen bilgiler C programcılarıiçin uygundur . Assembly programcılarıbundan daha fazla bilgiye ihtiyaç duyar.
Ne yazık ki bunun kesin bir cevabıyoktur. Çoğu sistem çarısı için EAX yazmacıolsada hepsi için değildir. En güzel yöntem çalışırken önce EAX yazmacına bakmak orada değilse ek aramalar yapmak olacaktır.
Not: Şimdiye kadar çalıştığımız fonksiyonların hepsi EAX yazmacına dönüşyaptısadece bir tanesi
EDX : SYS_forkbunlardan değildi. Ama yinede sistem çağrılarının tamamınıkullanmışdeğiliz.
İpucu: Eğer burada yada herhangi başka bir yerde aklınızdaki soruların cevabını bulamadıysanız libc kütüphanesi üzerinde çalışarak çekirdek ile nasıl bir etkileşim içinde olduğunu inceleyebilirsiniz.
Aslında hiç bir yerde...
errno C dilinin içinde olan bir kavram Unix çekirdeğinde değil. Eğer çekirdek servislerine direk erişim yapıyorsanız hata kodu EAX içine dönülecektir yani hata olmadığında fonksiyonların dönüş değerlerinin konulduğu yere.
Bu çok mantıklıdır , eğer bir hata oluşmazsa hata kodu olmayacaktır ve eğer bir hata oluşursa fonksiyon geri dönüşdeğeri olmayacaktır. Yani EAX yazmacıbu ikisinden birini taşıyacaktır.
Eğer standart FreeBSD düzenini kullanıyorsanız 'carry flag' olarak adlandırılan bir bit, hata olmadığında 0 hata durumunda ise 1 değerini alır.
Linux emülasyon modunda ise EAX değeri sıfırdan büyük bir sayı ise başarılıdurumu sıfırdan küçük ise hatalıdurumu belirtir.Bir başka deyişle -errno.