2009-06-08 4 views
5

arasındaki farklar Bir Linux makinesindeki statvfs komutunu, bağlı bir dosya sisteminde kullanılabilir boş alanı elde etmek için kullandığımda, aldığım sayı, df tarafından bildirilenden biraz farklı. makinede ÖrneğinStatvfs ve df komutu çağrısı

, bir ben df aşağıdaki çıktıyı almak, bir 500G sabit disk ile vardır:

# df --block-size=1 --no-sync 
Filesystem   1B-blocks  Used Available Use% Mounted on 
/dev/md0    492256247808 3422584832 463828406272 1%/
tmpfs    2025721856   0 2025721856 0% /lib/init/rw 
varrun    2025721856 114688 2025607168 1% /var/run 
varlock    2025721856  4096 2025717760 1% /var/lock 
udev     2025721856 147456 2025574400 1% /dev 
tmpfs    2025721856  94208 2025627648 1% /dev/shm 

StatVFS için bir çağrı bana 4096 ve 119.344.155 serbest blok blok boyutunu verir, bu yüzden 488,833,658,880 bayt ücretsiz olmalıdır. Ancak, df raporları 463,828,406,272 bayt ücretsizdir. Neden burada bir tutarsızlık var? > StatVFS ait f_bfree ile değil - - sizin tutarsızlık yana

cevap

7

kökü için ayrılan varsayılan yüzdesidir% 5 [1], yakın, sizinle df sonucunu karşılaştırmak olasılığı vardır> f_bavail, df hangi kullanır.

[1] : (488.833.658.880-463828406272)/492256247808 = 0,0508

+0

Ahh ... Görüyorum. Evet, f_bavail kullanarak rakamlar aynıdır. Bilgi için çok teşekkürler. –

+0

Ücretsiz yüzdelerin hesaplanmasında bir tutarsızlık buluyorum. (F_bavail * 100.0)/f_blocks hesapladığımda - (% - df'den yüzde yüzdelik kullanım) elde etmeyi beklerim - Bununla birlikte, bu% 4'lük bir değerdir, f_bfree kullanırsam hata daha fazla olur. –

0
#include <stdio.h> 
#include <sys/statvfs.h> 
int main(){ 
    struct statvfs stat; 
    int a=statvfs("/",&stat); 
    printf("total free disk space of the partition: %d GB \n",(stat.f_bavail)*8/2097152); 
    //512 is 2^9 - one half of a kilobyte. 
    //A kilobyte is 2^10. A megabyte is 2^20. A gigabyte is 2^30. A terabyte 
    //is 2^40. And so on. The common computer units go up by 10's of powers 
    //of 2 like that. 
    //So you need to divide by 2^(30-9) == 2^21 == 2097152 to get gigabytes. 
    //And multiply by 8 because 1 byte=8bit 
    return 0; 
} 

Ben Gb sonucunu tercih çünkü bu formda, ancak ne exponent.And değişen birimlerini değiştirebilir doğrudur ilk cevabı görebildiğiniz gibi ben de onu kullanıyorum