LINUX.ORG.RU

Как я могу получить занятое/свободное/общее место на файловой системе xfs, используя язык Си

 , , ,


0

2

Всем привет, возник вопрос как можно получить разные типы размеров(свободное, занятое, общее) на файловой системе XFS? например так же как это делает df или xfs_estimate, но не используя эти команды и не парся их. как нибудь через какие то бибилотеки или через ядро

А что мешает посмотреть код df?

akk ★★★★★
()

как можно получить разные типы размеров(свободное, занятое, общее) на файловой системе

statfs()

А список смонтированных файловых систем, их типы и пути можно найти в файле /proc/mount.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от akk

А, ну да.

А есть не-Linux-only способ определить тип ФС без того, чтобы парсить /proc/mounts? Вроде во FreeBSD теперь procfs и не монтируют даже.

i-rinat ★★★★★
()
Ответ на: комментарий от no-such-file

У меня нет под рукой FreeBSD, чтобы проверить. Там разве есть mtab? Поверхностный поиск по интернету даёт ссылки на инструкции по установке софта в линуксятор, и там упоминается, что нужно создать mtab в дереве для линуксятора. С замечанием, мол, очень удобно, что не нужно засорять /etc файлами, которые нужны только под линуксом.

i-rinat ★★★★★
()
Ответ на: комментарий от akk

statfs() is Linux only.

Враньё.

The statfs() system call first appeared in 4.4BSD.

https://www.freebsd.org/cgi/man.cgi?statfs http://man.openbsd.org/statfs

Use statvfs() instead.

Плохой совет.

The statvfs() and fstatvfs() functions fill the structure pointed to by buf with garbage. This garbage will occasionally bear resemblance to file system statistics, but portable applications must not depend on this.

отсюда: https://www.freebsd.org/cgi/man.cgi?statvfs

firkax ★★★★★
()
Ответ на: комментарий от i-rinat

В BSD есть statfs(), см. выше.

/etc/mtab там нет

Нативный способ получить список - getfsstat().

Полностью идеально кроссплатформенного способа получить информацию о файловых системах нет, без ifdef-ов не обойтись. Ну или парсить вывод mount или df.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Для того, чтобы определить тип ФС, не надо и не следует парсить /proc/mounts. Для скриптов лучше использовать lsblk, для C/C++ libudev. Вся эта кухня, конечно, Linux-only и завязана на sysfs. Что сейчас в других системах вместо udev, я «не знав, не знав, та и забувся».

ABW ★★★★★
()
Ответ на: комментарий от ABW

Вся эта кухня, конечно, Linux-only

Если только под Linux, проще statfs() использовать. Поле f_type как раз и даёт тип ФС.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Может быть, но а) это только для смонтированных, б) переводить все эти magic-и в человеческие обозначения...

ABW ★★★★★
()
Ответ на: комментарий от ABW

переводить все эти magic-и в человеческие обозначения

Разные задачи, разные требования, разные проблемы.

В последний раз, когда я смотрел на statfs/statvfs, мне нужно было определять, находится ли файл на FUSE файловой системе определённого типа, причём проверять достаточно часто, буквально на каждый перехваченный open(). Каждый раз лазить в /proc/mounts и парсить его было бы уж совсем медленно. Но если перед тем, как проверять /proc/mounts вызвать statfs(), становится не так уж медленно. Так что мне было достаточно проверять, FUSE_SUPER_MAGIC или нет.

i-rinat ★★★★★
()
Ответ на: комментарий от firkax

/etc/mtab там нет

Всё-то у них через жопу. Зачем было выпиливать, если нет альтернативы?

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.