# blkid /dev/sdX
указывает тип файловой системы раздела, смонтированный или отключенный. Как я могу сделать это из C / C ++ без вызова системного вызова и синтаксического анализа вывода? Как это сделать программно? Есть ли blkid-dev
пакет?
В Linux на C / C ++ как определить тип файловой системы смонтированного или отключенного раздела
Ответы (3)
Вы всегда можете использовать библиотеки blkid
(для ubuntu это так же просто, как установить libblkid-dev). А для реального использования см: https://github.com/fritzone/sinfonifry/blob/master/plugins/disk_status/client/disk_status.cpp (извините за рекламный код из моего собственного репозитория, но он имеет именно эту функциональность, развитую там). И не забывайте, что вам нужно будет запустить приложение с помощью sudo, чтобы иметь полный доступ к диску.
Для смонтированных разделов ваша программа на C ++ может последовательно читать и анализировать псевдо-файл /proc/self/mounts
, см. proc (5)
Для размонтированных разделов они могут содержать что угодно (включая полное отсутствие файловой системы, данные подкачки или необработанные данные - например, для некоторой системы баз данных). Так что вопрос может быть даже бессмысленным. Вы могли бы popen
какую-нибудь file -s
команду.
Вам следует изучить исходный код /bin/mount
, поскольку это бесплатное программное обеспечение (и оно делает то же самое в случае auto
). Вы можете использовать libmagic (3) (который используется командой file (1))
mount
:)
- person Necktwi; 03.09.2014
mount
с типом auto
. Почему вы не можете использовать эту команду?
- person Basile Starynkevitch; 03.09.2014
auto
в mount
функции?
- person Necktwi; 03.09.2014
system(3)
на /bin/mount
; вы можете изучить его исходный код /bin/mount
и посмотреть, как это делается.
- person Basile Starynkevitch; 03.09.2014
ntfs-3g
. Так что auto
мне не показался хорошим вариантом.
- person Necktwi; 03.09.2014
mount
показывает мне способ определения fs
типа.
- person Necktwi; 03.09.2014
Для смонтированного раздела вместо чтения / proc / self / mounts вы можете это сделать (при условии, что вы знаете путь, по которому смонтирован раздел):
#include <sys/vfs.h>
#include <stdio.h>
#include <linux/magic.h>
static const struct {
unsigned long magic;
const char *type;
} types[] = {
{EXT4_SUPER_MAGIC, "ext4"},
{TMPFS_MAGIC, "tmpfs"},
};
const char *get_type(unsigned long magic) {
static const char * unkown="unkown";
unsigned int i;
for (i=0; i < sizeof(types)/sizeof(types[0]); i++)
if (types[i].magic == magic)
return types[i].type;
return unkown;
}
void main() {
struct statfs buf;
statfs("/", &buf);
printf("/ is %s\n", get_type((unsigned long)buf.f_type));
statfs("/tmp", &buf);
printf("/tmp is %s\n", get_type((unsigned long)buf.f_type));
}
В моем случае отображается:
/ is ext4
/tmp is tmpfs
Подробнее см.
man statfs
Очевидно, вы можете добавить все нужные вам типы. Они перечислены на странице руководства statfs. Говорят, что statfs устарел, потому что я не знаю другого вызова, который бы возвращал тип файловой системы.