stat () и размер блока в Cygwin - PullRequest
0 голосов
/ 01 мая 2018

Я хочу, чтобы код был похож на функцию du. Я попробовал это с помощью функции stat(). Я узнал, что st_blocks сообщается из stat() - это фактический номер блока, выделенный на диске. Размер блока должен составлять 512 байт, а st_blocks*512 должно быть выделенным номером байта для файла. Тем не менее, я нашел сбой с толку в среде Cygwin. Сначала я создаю файл размером 8 КБ, используя команду dd.

% dd if=/dev/urandom bs=4096 count=2 of=testfile
2+0 records in
2+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00791222 s, 1.0 MB/s

Затем я запускаю команду stat с файлом:

% stat testfile
  File: testfile
  Size: 8192            Blocks: 8          IO Block: 65536  regular file
Device: 7727c30h/124943408d     Inode: 25614222880771065  Links: 1
Access: (0664/-rw-rw-r--)  Uid: (197881/ crystal)   Gid: (  513/    None)
Access: 2018-05-01 15:11:50.760626400 +0800
Modify: 2018-05-01 15:11:50.761626500 +0800
Change: 2018-05-01 15:11:50.761626500 +0800
 Birth: 2018-05-01 15:11:50.760626400 +0800

Я не думаю, что в сгенерированном файле есть «дыра». Я получаю файл с 8 выделенными блоками, который подразумевает, что размер блока составляет 1 КБ, а не 512 Б. Если я делаю код C с вызовом stat(), st_blocks получает тот же результат.

Пока что все статьи говорят, что размер блока составляет 512 ББ. Есть ли исключение? Если да, как я могу получить фактический размер блока? Или как я могу получить фактическое дисковое пространство, занимаемое файлом?

1 Ответ

0 голосов
/ 01 мая 2018

Инструмент командной строки stat имеет параметр формата %B, который отображает размер используемого блока. Похоже, stat использует 1024-байтовый блок в Cygwin.

Кроме того, похоже, что размер блока NTFS 4096 байт - это фактически то, что используется под капотом, а stat просто представляет блоки 1024 байт:

$ dd if=/dev/urandom of=foo count=1 bs=4095
$ stat -c '%B %b' foo
1024 4
$ dd if=/dev/urandom of=foo count=1 bs=4097
$ stat -c '%B %b' foo
1024 8

Существует обсуждение того, откуда 512-байтовые и 1024-байтовые размеры блоков поступают в https://unix.stackexchange.com/questions/28780/file-block-size-difference-between-stat-and-ls. Очевидно, это связано с соглашениями ядра Linux и соглашениями утилит GNU.

...