Я написал небольшой фрагмент кода, который использует системный вызов nftw для того, чтобы сделать дерево, идущее.общий размер каталога с nftw отличается от du output
int flags =0;
flags = flags | FTW_MOUNT;
int nopenfd = 10;
if(nftw(argv[1], sum_sizes, nopenfd, flags) == -1)
return EXIT_FAILURE;
С помощью этой опции, nftw не сканирует каталог, если это устанавливается точка и разыменовывает символическую ссылку (поведение по умолчанию).
На каждом файл nftw называют эту функцию:
/*total_size is the sum of each file/directory/link*/
long long int total_size, total_real_size = 0;
static int sum_sizes(const char *pathname, const struct stat *statbuf, int typeflag, struct FTW *ftwbuf)
{
/*if stat failed on the current file*/
if(typeflag == FTW_NS)
{
printf("No stats (permissions ?) on %s", pathname);
return 0;
}
total_size = total_size + (long long int) statbuf->st_size;
total_real_size = total_real_size + (long long int) (statbuf->st_blocks * 512);
return 0;
}
Так В конце концов, я показываю кумулятивные размеры:
printf("total size: %lld (%0.2lf K %0.2lf M)\n", total_size, (float)total_size /1024.0, (float)total_size /(1024.0*1024.0));
printf("total real size: %lld (%0.2lf K %0.2lf M)\n", total_real_size, (float)total_real_size /1024.0, (float)total_real_size /(1024.0*1024.0));
Когда я сравниваю значение с им У меня есть некоторые различия
time ./scan_dir ~/
====>
total size: 15208413390 (14851966.00 K 14503.87 M)
total real size: 15708553216 (15340384.00 K 14980.84 M)
block size : 4096/fond. block size : 4096
fs size: 22.7895 G
./scan_dir ~/ 0,03s user 0,24s system 98% cpu 0,277 total
time du -s ~/
15119876 /home/cedlemo/
du -s ~/ 0,07s user 0,22s system 98% cpu 0,287 total
Примечание: после прочтения man-страницы du я знаю, что du имеет почти такое же поведение, что и мой l ittle application scan_dir (пропустить точки монтирования, символическую ссылку derefrences и использовать 1024 для вычисления значения в Ko)
Похоже, что более близкое значение, найденное в моем приложении, - это сумма реального размера (используемые блоки), но значение на самом деле не то же самое.
В чем может быть причина этой разницы? Что я делаю неправильно?
Спасибо за ваш ответ (очень впечатляет), вы решаете мою проблему (я неправильно понял поведение флагов FTW_PHYS). Мои новые значения: '14547636,00 K для моего небольшого приложения' и' 14547532 для du-s', поэтому на основе вывода du, разница незначительна: '((14547944 - 14547532) ÷ 14547532) × 100) = 0, 002832096% ' – cedlemo