Получить размер файла блока на MacO с помощью statfs - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу узнать, что такое размер файла блока под MacOs. В моем примере я пытаюсь определить / dev / disk0:

diskutil info /dev/disk0
   Device Identifier:         disk0
   Device Node:               /dev/disk0
   Whole:                     Yes
   Part of Whole:             disk0
   Device / Media Name:       APPLE SSD SD0128F

   Volume Name:               Not applicable (no file system)
   Mounted:                   Not applicable (no file system)
   File System:               None

   Content (IOContent):       GUID_partition_scheme
   OS Can Be Installed:       No
   Media Type:                Generic
   Protocol:                  PCI
   SMART Status:              Verified

   Disk Size:                 121.3 GB (121332826112 Bytes) (exactly 236978176 512-Byte-Units)

Diskutil дает правильный размер "123,3 ГБ". Теперь то же самое, используя statfs: (https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/statfs.2.html# // apple_ref / doc / man / 2 / statfs ):

#include <iostream>

#include <sys/param.h>
#include <sys/mount.h>

int main()
{
        struct statfs s;
        statfs("/dev/disk0", &s);
        std::cout << s.f_bsize * s.f_blocks << " B\n";
}

Вывод: 196096 B

1 Ответ

2 голосов
/ 23 апреля 2020

Документация statfs выглядит следующим образом:

Statfs () возвращает информацию о смонтированной файловой системе. Путь - это путь к любому файлу в смонтированной файловой системе. Buf - указатель на структуру statfs или statfs64, определенную следующим образом ...

Вы передаете /dev/disk0 в качестве пути, который даст вам размер любой файловой системы, представленной /dev, которая скорее всего, это что-то вроде devtmpfs. Ваш путь должен быть именем файла или путем в файловой системе, содержащей /dev/disk0, а не самим блочным устройством.

Для произвольного блочного устройства:

Выпуск IOCTL согласно документации :

int fd = open("/dev/whatever", O_RDONLY);
if(fd  < 0) {
    // error handling
}
uint64_t count;
if(ioctl(fd, DKIOCGETBLOCKCOUNT, &count) < 0) {
    // error handling
}
uint32_t bsize;
if(ioctl(fd, DKIOCGETBLOCKSIZE, &bsize) < 0) {
    // error handling
}
return count * bsize;
...