2010-04-14 22 views
13

Temel olarak bir sınıf için UNIX ls komutunun bir kopyasını yazmam gerekiyor ve neredeyse her şey çalışıyor. Nasıl yapılacağını anlayamadığım bir şey, bir dosyanın sembolik bir bağlantı olup olmadığını kontrol etmektir. stat() için man sayfasından, mode_t değeri tanımlanmış, S_IFLNK olduğunu görüyorum.Stat() işlevinin bir dosyanın sembolik bir bağlantı olup olmadığını nasıl belirliyorsunuz?

switch(stbuf.st_mode & S_IFMT){ 
    case S_IFLNK: 
     printf("this is a link\n"); 
     break; 
    case S_IFREG: 
     printf("this is not a link\n"); 
     break; 
} 

Kodum:

Bu benim bir dosya, bir sym-link hiçbir şans ile olup olmadığını kontrol etmek çalışıyorum nasıl (not, stbuf stat() içine inode verilerini döndüğünü tampon) HER ZAMAN olsa bile this is not a link yazdırır ve ben gerçek ls komutu öyle diyor beri söz konusu dosya sembolik bir bağlantı olduğunu biliyorum, artı ben sym-link yarattı ...

Ben ne yapabilirim yanlış mı yapıyorsun? Yardım için teşekkürler!

+2

Benim durumumdan alıntı (2) manpage: lstat(), stat() ile aynıdır, ancak yolun sembolik bir bağ olması durumunda, bağlantının kendisi başvurulan dosya değil, kendisidir. – Philip

cevap

21

Yapamazsınız.

Linkin kendisini lstat() numaralı telefonu kullanmanız gerekmektedir, bağlantıyı düz stat() izleyecektir ve böylece bağlantının kendisini "görmez".

+0

Peki neden stat() komutunu kullanıyorsunuz? Ben sadece lstat() kullanmayı denedim ve bağlantıları işlemek dışında, aynı bilgiyi sağladığı görülüyor. Stat() 'ı yalnızca herhangi bir sim-link'le uğraşmadığınızı biliyorsanız kullanır mısınız? – hora

+3

Ayrıca, symlinks ile uğraşırken de kullanırsınız, genellikle yolun normal bir dosya mı yoksa bir bağlantı mı olduğu umrunda değil, kullandığınız dosyayı önemsersiniz. Örneğin bağlantı için mtime tamamen ilgisiz, bağlantıyı işaret ettiği dosya için mtime olduğunu. – wich

+2

'stat()' * bağlantıları * ele alır, bunları yalnızca farklı şekilde işler - bağlantıyı izler ve gösterdiği dosya hakkında bilgi verir (hangilerinin işaret ettiği gibi, çoğu zaman ne istediğinizi belirtir). – caf