Bu işlev readdir işlevinin evresel sürümüdür. readdir işlevi gibi dizindeki sonraki girdiyi okur. Fakat sonuç durağan ayrılmış bellekte saklanmadığından aynı anda çalışan evreler arasında bir soruna yol açmaz. Sonuç girdi ile gösterilen nesne içinde döner.
Normalde, readdir_r işlevi sıfırla döner ve girdi *sonuç'a atanır. Okunacak başka girdi kalmamışsa ya da bir hata saptanmışsa readdir_r *sonuç'a bir boş gösterici atar ve sıfırdan farklı bir hata kodu ile döner. Ayrıca bu hata kodunu errno değişkenine atar. Bu işlev için tanımlanmış hata kodları readdir ile aynıdır.
| Taşınabilirlik Bilgisi |
---|
Bazı sistemlerde struct dirent yapısının d_reclen diye bir üyesi olmasa ve dosya isminin izin verilen en büyük boyutta olabilmesine izin verilse bile readdir_r dosya ismi için boş karakter sonlandırmalı dizge döndürmeyebilir. Günümüzdeki sistemlerin tamamı d_reclen alanına sahiptir ve eski sistemlerde çok evrelilik pek sorun oluşturmaz. Her durumda readdir ile ilgili böyle bir sorun yoktur, yani d_reclen üyesine sahip olmayan sistemlerde bile harici kilitleme ile çok evrelilik mümkün olur. |
Ayrıca, struct dirent türünün tanımlanması da önem kazanır. readdir_r işlevinin ikinci parametresinde bu türde bir nesneye basitçe gösterici atanması yeterli olmayabilir. Bazı sistemler d_name elemanını yeterli uzunlukta tanımlamazlar. Bu durumda kullanıcının ek alan sağlaması gerekir. d_name dizisinde en azından NAME_MAX + 1 karakterlik alan bulunmalıdır. readdir_r çağrısı şöyle yapılabilir:
union
{
struct dirent d;
char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
} u;
if (readdir_r (dir, &u.d, &res) == 0)
…