Alıntı (canalpay):
> scope denediğimde hata verdirtmiyor
Gerçekler:
[DÜZELTME: Burada file.close demek istedim.]
-
File.close, dosyayı kapatır ve dolayısıyla işletim sistemi kaynaklarını geri verir
-
File'ın sonlandırıcı işlevi, dosya açıksa close()'u çağırır
-
new ile oluşturulan nesne, normalde çöp toplayıcı tarafından ilerideki belirsiz bir zamanda sonlandırılır
Teori:
Çöp toplayıcı devreye girene kadar, sistemde dosyaya erişim sağlayacak kaynak kalmıyor. (Belirli sayının üstünde dosyanın açık olmasına izin verilmez.) Bir sonraki erişim de bu yüzden başarısız oluyor.
Hatta bu sınır, "program başına dosya" gibi bir sınır olmalı. Aşağıdaki program benim sistemimde en son 1020 yazıyor. Yani [0,1020] aralığında 1021 adet dosya açabiliyor. din, dout, ve derr'i de sayarsak; benim sistemim bir programın (process'in) 1024 dosyadan fazla açmasına izin vermiyor. Bu, çekirdekle ilgili bir ayardır.
Program şu:
import std.cstream;
import std.stream;
void main()
{
foreach (i; 0 .. 10_000) {
// Bu program şu hatayla çöker:
// std.stream.OpenException: Cannot open or create file 'deneme.txt'
//
// Hatayı gidermek için; şunlardan birisi yeterli:
//
// a) satırın başına 'scope' yazmak
auto dosya = new File("deneme.txt", FileMode.In);
// b) burada dosya.close(); yazmak
dout.writef(i, ' ');
}
}
Şimdi öğrendim: konsolda 'ulimit -a' yazmak, bu gibi sınırları bildiriyor. Onlardan '-n' ile de öğrenilebilen bir tanesi "open files", ve değeri bende 1024. (Değiştirilebiliyor; ama o işe girmeyeceğim. :) )
Eğer senin sisteminle benim sistemim arasında açık dosya sınırları farklıysa, veya çöp toplayıcının devreye girme kararı ikimizde farklıysa, bu hatayı benim neden görmediğim anlaşılır.
scope ise nesnenin çöp toplayıcıya bırakılmadan hemen sonlandırılmasını sağladığı için, program en fazla bir dosya kullanıyor ve sistem kaynakları tükenmiyor.
Öte yandan; std.stdio.File bir yapı olduğu için, onun nesneleri hemen sonlandırılıyor ve o tür kullanıldığında bu sorun yaşanmıyor. Bu, std.stdio.File'ın daha üstün olduğunu göstermez, :) yapılarla sınıfların bir farkını gösterir.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]