2010-07-13 20 views
10

Bir dosya tanıtıcısının aranabilir olup olmadığını belirlemek için (POSIX sistemlerinde) taşınabilir bir yol var mı? Benim düşüncem lseek(fd, 0, SEEK_CUR); kullanmak ve dönüş değeri -1 olup olmadığını kontrol etmektir, ancak bunun yanlış negatifler veya yanlış pozitifler verebileceğinden emin değilim. fstat'u kullanarak ve hangi dosya türlerinin aranabilir/seçilemez olmadığına dair varsayımlarda bulunmak iyi bir fikir gibi gelmez. Başka fikirlerin var mı?Bir dosya tanıtıcısının aranabilir olup olmadığı nasıl belirlenir?

cevap

10

lseek yöntemi makul görünüyor. Bu kesinlikle yanlış bir olumsuzluğa neden olamaz - eğer yapıldıysa, uygulamada ciddi bir sorun var. Ayrıca, POSIX spec'a göre, tanımlayıcının bir boru, FIFO veya soket olması durumunda başarısız olması, teorik olarak yanlış pozitiflere sahip olmamanız gerekir. Kalan tek soru, farklı sistemlerin özelliklerle ne kadar iyi uyumlu olduğudur. Ancak, başka herhangi bir yöntem, her ne olursa olsun, kesinlikle bundan daha az taşınabilir olacak gibi görünüyor.

2

Düzenli bir dosya olup olmadığını kontrol etmek için fstat() öğesini, daha sonra da stat yapısının mod alanındaki S_ISREG makrosunu kullanabilirsiniz; Düzenli bir dosya, per definiton, bir "düzenli olmayan" (özel) dosyası olmayabilirken (aynı zamanda aranabilir özel dosyalar olup olmadığını bilmiyorum) aranabilir.

Ancak, lseek() ve errno == ESPIPE öğelerinin dönüş değerlerinin de kontrol edilmesi gerekir. Prensip olarak, the effect of lseek() on devices which are incapable of seeking is implementation-defined, bu yüzden nazal daemonlara dikkat edin.

+3

Sabit sürücüler gibi engelleme aygıtları aranabilir. Belki karakter aygıtları bile, ama emin değilim. – Thomas

+1

gerçekten aranamayan bazı cihazlar aramaya cevap vermeyecek (Linux'ta bir başkası, arama yapmakta başarısız oldu ama davranışa bağlı kullanıcı alanlarını keşfetti ...) – Spudd86

+0

Doğru; Bazı karakter aygıt sürücüleri sadece seek() öğesini göz ardı eder ve sessizce geri döner. –

İlgili konular