errno Değişkeni, strerror ve perror Fonksiyonları
Standart C fonksiyonlarının bazıları ve POSIX fonksiyonlarının çoğu başarısızlık durumunda
–1 değerine geri dönerler. Ancak bu fonksiyonlar başarısızlığın nedenini geri dönmeden önce
kütüphanedeki errno isimli global bir değişkene yazarlar. errno errno.h dosyası içerisinde
extern olarak bildirilmiştir. Bu değişkenin global tanımlaması kütüphane içerisinde
yapılmıştır. errno int türden bir değişkendir. Hata oluştuktan sonra errno içerisindeki her bir
değer faklı bir hata durumunu anlatmaktadır. Bu sayısal değerler aynı zamanda EXXX
biçiminde sembolik sabitler olarak errno.h içerisinde define edilmiştir. Böylece errno
değişkeninin karşılaştırılmasında sembolik sabitler kullanılır.
if (errno == ENOEND) {
//...
//...
}
Bir hata oluştuğunda hata olasılıklarının ne olduğu POSIX içerisinde dokümante edilmiştir.
Örneğin bir dosyanın açılamadığını düşünelim; dosyanın açılamamasının belirli sayıda nedeni
vardır. Ancak programcılar oluşan hata için bir mesaj metni yazdırmak isterler ve bu da
yardımcı fonksiyonlar kullanılmadan zor yapılacak bir işlem değildir. strerror fonksiyonu hata
numarasını, yani errno değişkeni içerisindeki sayıyı parametre olarak alır ve mesaj metnine
geri döner. Prototipi string.h dosyası içerisindedir.
char *strerror(int errno);
Fonksiyon static yerel bir dizinin adresi ile geri dönmektedir. Örneğin fonksiyon şöyle
kullanılabilir:
C ve Sistem Programcıları Derneği 14
if (open(...) == -1) {
pMessage = strerror(errno);
puts(pMessage);
exit(1);
}
perror fonksiyonu doğrudan errno global değişkenine bakarak mesaj metnini stdout dosyasına
yazdıran kullanışlı bir fonksiyondur. Prototipi stdio.h dosyası içerisindedir.
void perror(const char *pMsg);
Fonksiyon önce parametresi ile belirtilen yazıyı yazar, sonra : karakterini yerleştirir, sonra da
errno değişkenine karşılık gelen mesaj metni yazdırır, en sonunda ‘\n’ ile aşağı satıra geçiş
yapılır. Örneğin;
if (open(...) == -1) {
perror(“Error”);
exit(1);
}