Dizin Ağaçlarıyla Çalışma
Önceki XIV. Oylum - Dosya Sistemi Arayüzü Sonraki
Dizin Ağaçlarıyla Çalışma
Buraya kadar açıklanan işlevler ya bilgiyi bit bit aldılar ya da tüm dosyaları grup halinde işleme soktular (bkz. scandir). Kimi zaman alt dizinler ve içerdikleri dosyalarla çalışmak gerekir. X/Open belirtimi bunu yapmak için iki işlev tanımlamıştır. Daha basit hali System V sistemlerindeki ilk tanımından türetilmiştir ve bu bakımdan bu işlev SVID'den türetilmiş sistemlerde bulunur. Prototipler ve gerekli tanımlar ftw.h başlık dosyasında bulunabilir.
Bu ailenin dört işlevi vardır: ftw, nftw ile 64 bitlik olanları ftw64 ve nftw64. Bu işlevlerin argümanlarından biri uygun türde bir eylemci işleve göstericidir.
__ftw_func_t
int (*) (const char *, const struct stat *, int)
veri türü
ftw işlevine belirtilen eylemci işlevin türüdür. İlk parametre dosya ismine bir gösterici, ikinci parametre ise ilk parametrede ismi belirtilen dosya için doldurulan struct stat türünde bir nesnedir.
Son parametre o anki dosya hakkında daha fazla bilgi veren bir değerdir. Son parametre şu değerleri içerebilir:
FTW_F
Öğe ya normal bir dosya ya da diğer kategorilerle eşleşmeyen (özel dosyalar, soketler gibi) bir dosyadır.
FTW_D
Öğe bir dizindir.
FTW_NS
stat çağrısı başarısız olduğundan ikinci parametrenin gösterdiği bilgi geçersizdir.
FTW_DNR
Öğe okunamayan bir dizindir.
FTW_SL
Öğe bir sembolik bağdır. Sembolik bağlar normalde izlendiğinden, bu değerin bir ftw eylemci işlevinde görünmesi sembolik bağın hedefindeki dosyanın mevcut olmadığı anlamına gelir. nftw işlevinde durum daha farklıdır.
Bu değer sadece, ilk başlık dosyasından önce _BSD_SOURCE veya _XOPEN_EXTENDED tanımlanarak derlenmiş bir yazılımda kullanılabilir. Özgün SVID sistemlerinde sembolik bağlar yoktur.
Eğer kaynaklar _FILE_OFFSET_BITS == 64 ile derlenmişse, bu tür aslında __ftw64_func_t türü olur. Aynı sebeple struct stat da struct stat64 olur.
LFS arayüzü ve ftw64 işlevinde kullanmak üzere __ftw64_func_t türü ftw.h dosyasında tanımlanmştır.
__ftw64_func_t
int (*) (const char *, const struct stat64 *, int)
veri türü
Bu tür ftw64 işlevine belirtilen eylemci işlevin türü olmak dışında __ftw_func_t türünün benzeridir. Eylemci işlevin ikinci parametresi daha geniş değerleri mümkün kılmak için struct stat64 türünde bir değişkene göstericidir.
__nftw_func_t
int (*) (const char *, const struct stat *, int, struct FTW *)
veri türü
İlk üç parametresi __ftw_func_t türü ile aynıdır. Ancak üçüncü argüman için daha hassas bir farklılaşmayı sağlamak için bazı ek değerler içerebilir:
FTW_DP
Öğe bir dizindir ve tüm alt dizinlerine girilmiş ve raporlanmıştır. Eğer nftw işlevi FTW_DEPTH seçeneği ile çağrılmışsa FTW_D yerine bu değer döner (aşağıya bakınız).
FTW_SLN
Öğe geçerliğini yitirmiş bir sembolik bağ. Yani gösterdiği dosya ortada yok.
Eylemci işlevin son parametresi aldığı ek değerler aşağıda açıklanan bir yapıya göstericidir.
Eğer kaynaklar _FILE_OFFSET_BITS == 64 ile derlenmişse, bu tür aslında __nftw64_func_t türü olur. Aynı sebeple struct stat da struct stat64 olur.
LFS arayüzü ve ftw64 işlevinde kullanmak üzere __nftw64_func_t türü ftw.h dosyasında tanımlanmştır.
__nftw64_func_t
int (*) (const char *, const struct stat64 *, int, struct FTW *)
veri türü
Bu tür nftw64 işlevine belirtilen eylemci işlevin türü olmak dışında __nftw_func_t türünün benzeridir. Eylemci işlevin ikinci parametresi daha geniş değerleri mümkün kılmak için struct stat64 türünde bir değişkene göstericidir.
struct FTW
veri türü
Bu yapının içerdiği bilgi isim parametresinin yorumlanmasına ve dizin hiyerarşisinin zikzaklı durumu hakkında bazı bilgiler verilmesine yardımcı olur.
int base
Değeri eylemci işlevin ilk parametresinde aktarılan dizgedeki dosya isminin dizgenin başlangıcına göre başlangıç konumudur. Dizgenin başlangıcında kalan bölüm dosyanın dosya yoludur. Çalışma dizini o an bulunan öğelerden biri olduğundan, nftw çağrısı FTW_CHDIR seçeneği ile yapıldığında bu bilgi önem kazanır.
int level
İşlem sırasında, dosyayı bulmak için kaç dizin içeri gidileceğini gösterir. İlk dizinin seviyesi 0'dır.
int ftw
(const char  *dosyaismi,
 __ftw_func_t eylemci-işlev,
 int          tanıtıcı-sayısı)
işlev
Bu işlev, dosyaismi ile belirtilen dizin ve alt dizinlerinde bulunan her öğe için eylemci-işlev parametresi ile belirtilen işlevi çağırır. İşlev gerekirse sembolik bağları da izler ama öğeyi iki defa işleme sokmaz. Eğer dosyaismi ile bir dizin belirtilmemişse eylemci işlev sadece bu öğe için çağrılır.
Eylemci işleve aktarılan dosya ismi dosyaismi parametresinden alınarak ve aktarılan tüm dizin isimleri ve yerel dosya ismi eklenerek oluşturulur. Böylece eylemci işlev dosyaya erişmek için bu parametreyi kullanabilir. ftw ayrıca dosya için stat çağrısı da yapar ve bu bilgiyi eylemci işleve aktarır. Eğer bu stat çağrısı başarısız olursa bu durum eylemci işlevin üçüncü argümanına FTW_NS aktarılarak belirtilir. Aksi takdirde, üçüncü argümana yukarıda __ftw_func_t açıklamasında belirtildiği gibi aktarım yapılır.
Bir hata oluşmadığını ve işlemin devam edebileceğini belirtmek üzere eylemci işlevin 0 döndürmesi beklenir. Eğer bir hata oluşmuşsa ya da ftw işlevinin işlemi hemen sonlandırması isteniyorsa sıfırdan farklı bir değer döndürülmelidir. Bu işlevi sonlandırmanın tek yoludur. Eylemci işlevin içinde işleme başka bir yerde devam etmek için setjmp veya benzeri bir işlev kullanılmamalıdır. Bu, ftw işlevinin ayırdığı özkaynakların ayrılmış olarak kalmasına sebep olur.
tanıtıcı-sayısı parametresi ile ftw işlevinin toplam kaç dosya tanıtıcısı kullanacağı belirtilir. Ne kadar çok dosya tanıtıcısı kullanmasına izin veririrse işlev o kadar hızlı çalışır. Dizin hiyerarşisindeki her alt dizin için en fazla bir dosya tanıtıcısı kullanılır, fakat çok derinlere inildiğinde açık dosya tanıtıcılarının sayısı süreç ya da sistem için belirlenmiş sınırları aşabilir. Dahası, çok evreli yazılımlarda bu katlanarak artar. Bu bakımdan açık dosya tanıtıcılarının sayısına kabul edilebilir bir sınır belirtmek gerekir.
Eğer tüm eylemci işlev çağrıları 0 ile dönmüşse ve ftw tüm eylemleri uygulayabilmişse, ftw 0 ile döner. Eğer bir işlev çağrısı başarısız olmuşsa (stat çağrıları hariç) -1 ile döner. Eğer eylemci işlev çağrılarından biri sıfırdan farklı bir değerle dönmüşse ftw işlevi bu dönüş değerini döndürür.
Kaynakların 32 bitlik bir sistemde _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev aslında ftw64 işlevidir, yani LFS arayüzü eski arayüzün yerine geçer.
int ftw64
(const char    *dosyaismi,
 __ftw64_func_t eylemci-işlev,
 int            tanıtıcı-sayısı)
işlev
Büyük dosyalı dosya sistemleri ile çalışması dışında bu işlev ftw işlevinin benzeridir. Eylemci işleve dosya bilgisi aktarılırken struct stat64 türünde bir değişken kullanılır.
32 bitlik bir sistemde, kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev ftw ismiyle bulunur ve eski gerçekleme tamamen LFS'ye uygun olarak değiştirilir.
int nftw
(const char   *dosyaismi,
 __nftw_func_t eylemci-işlev,
 int           tanıtıcı-sayısı,
 int           seçenek)
işlev
nftw işlevi ftw işlevi gibi çalışır. dosyaismi ile belirtilen dizin ve alt dizinlerinde ve aşağıda açıklandığı gibi bulunan her öğe için eylemci-işlev parametresi ile belirtilen işlevi çağırır. tanıtıcı-sayısı parametresi ile nftw işlevinin toplam kaç dosya tanıtıcısı kullanacağı belirtilir.
Birinci fark eylemci işlevin türüdür. Yukarıda açıklandığı gibi struct FTW * türündeki eylemci işleve ek bilgi aktarılabilir.
İkinci fark, nftw işlevinin dördüncü bir argüman almasıdır. Bu argümana 0 veya aşağıdaki değerlerin bit seviyesinde VEYAlanmış değeri aktarılabilir:
FTW_PHYS
Dizin taranırken sembolik bağlar izlenmez. Bunun yerine sembolik bağlar eylemci işlevin tür parametresinde FTW_SL değeri kullanılarak belirtilir. Eğer sembolik bağın hedefindeki dosya mevcut değilse, bunun yerine FTW_SLN döner.
FTW_MOUNT
Eylemci işlevden dosyaismi ile belirtilen dizinin bulunduğu dosya sistemine bağlı diğer dosya sistemlerindeki alt dizinlerle ilgili bilgi istenmez.
FTW_CHDIR
Bu seçenek verilmişse eylemci işlev çağrılmadan önce çalışma dizininden raporlanan dizine geçilir. ntfw işlevi eylemci işlev döndükten sonra tekrar eski çalışma dizinine geçer.
FTW_DEPTH
Bu seçenek verilmişse ana dizin içeriği işlenmeden önce alt dizinler ve onların dosyaları üzerinde işlem yapılır (önce derinlik kipi). Bu durum ayrıca eylemci işleve FTW_D değil FTW_DP değeri aktarılarak belirtilir.
FTW_ACTIONRETVAL
Bu seçenek belirtilmişse eylemci işlevin dönüş değeri farklı işlem görür. Eğer eylemci işlev FTW_CONTINUE ile dönerse işlem normal olarak devam eder. FTW_STOP işlemi durdur ve işlev bu değerle döner. Eğer FTW_D argümanı ile çağrılmış eylemci işlev FTW_SKIP_SUBTREE değeri ile dönerse, alt ağaç atlanır ve sonraki kardeş dizinden devam edilir; FTW_SKIP_SIBLINGS değeri dönerse, o anki girdinin tüm kardeş dizinleri atlanır ve işlem bir üst dizinden devam eder. Bu seçeneğin belirtildiği durumda eylemci işlev bu değerlerin dışında bir değer döndürmemelidir. Bu seçenek bir GNU oluşumudur.
İşlevin dönüş değeri ftw işlevindeki gibi değerlendirilir. Eğer tüm eylemci işlev çağrıları 0 ile dönmüşse ve nftw tüm eylemleri uygulayabilmişse, nftw işlevi 0 ile döner. Bellek sorunu gibi bir dahili bir hata oluşmuşsa işlev -1 ile döner ve hata durumu errno değişkenine atanır. Eğer eylemci işlev çağrılarından biri sıfırdan farklı bir değerle dönmüşse nftw işlevi bu dönüş değerini döndürür.
Kaynakların 32 bitlik bir sistemde _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev aslında nftw64 işlevidir, yani LFS arayüzü eski arayüzün yerine geçer.
int nftw64
(const char     *dosyaismi,
 __nftw64_func_t eylemci-işlev,
 int             tanıtıcı-sayısı,
 int             seçenek)
işlev
Büyük dosyalı dosya sistemleri ile çalışması dışında bu işlev nftw işlevinin benzeridir. Eylemci işleve dosya bilgisi aktarılırken struct stat64 türünde bir değişken kullanılır.
32 bitlik bir sistemde, kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev nftw ismiyle bulunur ve eski gerçekleme tamamen LFS'ye uygun olarak değiştirilir.
Önceki Üst Ana Başlık Sonraki
Bir Dizinin İçeriğini Listeleyen İkinci Örnek Başlangıç Sabit Bağlar
Bir Linux Kitaplığı Sayfası