C kütüphanesi errno
tarihsel nedenlerden dolayı 0 olarak ayarlanmamıştır 1 . POSIX, artık kitaplıklarının başarı durumunda değeri değiştirmeyeceğini iddia etmiyor ve yeni Linux kılavuz sayfasıerrno.h
bunu yansıtıyor:
<errno.h>
Başlık dosyası tamsayı değişkeni tanımlayan errno
sistem çağrıları ve neyin yanlış gittiğini belirtmek için bir hata durumunda bazı kütüphane fonksiyonları tarafından belirlenir. Değeri yalnızca çağrının dönüş değeri bir hata gösterdiğinde (yani, -1
çoğu sistem çağrısından -1
veya NULL
çoğu kütüphane fonksiyonundan) önemlidir ; başarılı olan bir fonksiyonun değişmesine izin verilir errno
.
ANSI C Gerekçe komitesi benimsenmesinin ve kullanmanın mevcut uygulamaları standart hale daha pratik olduğunu hissettim belirtiyor errno
.
Ayarı üzerinde odaklanan hata raporlama makineleri errno
genellikle en iyi toleransla değerlendirilir. Kütüphane işlevleri arasında `` patolojik bir bağlantı '' gerektirir ve paylaşılabilir kütüphanelerin yapımına müdahale eden statik yazılabilir bellek hücresini kullanır. Bununla birlikte, Komite daha iddialı bir şey icat etmek yerine, bu eksik, ancak mevcut olan makineleri standartlaştırmayı tercih etmiştir.
Hemen hemen her zaman errno
ayarlanmış olup olmadığını kontrol dışında hata kontrol etmek için bir yolu vardır . Olmadığını kontrol etme errno
var kümesi her zaman güvenilir değildir bazı aramalar hata nedeni almak için ayrı bir API çağrısı gerektirir beri. Örneğin ferror()
, fread()
veya öğesinden kısa bir sonuç alırsanız bir hatayı kontrol etmek için kullanılır fwrite()
.
İlginçtir ki, kullanmanın senin örneğin strtod()
ayarlarken durumlarda biridir errno
çağrı önce 0'a gerekli bir hata oluştu eğer doğru algılamak için. Tüm strto*()
dize-sayı işlevleri bu gereksinime sahiptir, çünkü bir hata karşısında bile geçerli bir dönüş değeri döndürülür.
errno = 0;
char *endptr;
double x = strtod(str1, &endptr);
if (endptr == str1) {
/*...parse error */
} else if (errno == ERANGE) {
if (x == 0) {
/*...underflow */
} else if (x == HUGE_VAL) {
/*...positive overflow */
} else if (x == -HUGE_VAL) {
/*...negative overflow */
} else {
/*...unknown range error? */
}
}
Yukarıdaki kod, strtod()
Linux'ta belgelendiği şekliyle davranışı temel alır . C standardı, yalnızca düşük akışın en küçük pozitif değerden daha büyük bir değer döndüremeyeceğini double
ve uygulama errno
olarak ayarlanıp ayarlanmayacağını ERANGE
uygulama 2 olarak tanımlamaktadır .
Aslında bir kütüphane çağrısından önce daima 0 olarak ayarlanmasını ve çağrıdan sonra değerinin kontrol edilmesini öneren kapsamlı bir sertifika danışma yazımı vardır . Bunun nedeni , çağrının kendisi başarılı olsa bile bazı kütüphane çağrılarının ayarlanmasıdır 3 .errno
errno
errno
Program başlangıcında 0 değeri , ancak hiçbir kütüphane işlevi tarafından asla 0 olarak ayarlanmaz. Kullanımı , C Standardındaki işlevin açıklamasında belgelenmediği errno
sürece, bir hata olup olmadığına bakılmaksızın kütüphane işlev çağrısı tarafından sıfırdan farklı olarak ayarlanabilir errno
. Bir programın içeriğini errno
ancak bir hata bildirildikten sonra incelemesi anlamlıdır . Daha doğrusu, errno
sadece errno
hataya ayarlanan bir kütüphane fonksiyonu bir hata kodu döndürdükten sonra anlamlıdır .
1. Daha önce, önceki bir çağrıdan gelen bir hatayı maskelemekten kaçınmak olduğunu iddia ettim. Bu iddiayı destekleyecek hiçbir kanıt bulamıyorum. Ayrıca sahte bir printf()
örnek vardı .
2. @chux'a bunu işaret ettiği için teşekkürler. Referans C.11 §7.22.1.3 ¶10'dur.
3. @KeithThompson tarafından bir yorumda belirtildi.
errno
, onu her zaman sıfıra ayarlayabilirsiniz.