Есть ли безопасный способ сопоставить путь файловой системы с / sys / block / node.
Например, в моей системе (Ubuntu) мой / путь монтируется из / dev / disk / by-uuid / 7f6a93a7-1e63-48a3-a7e3-b336a2f9dbf7, который является символической ссылкой на / dev / sda1, который является разделом / dev / sda который соответствует / sys / block / sda
Как мне получить:
/ -> /sys/block/sda
безопасным способом, на который я могу положиться при работе со всеми дистрибутивами?
Спасибо Caskey за то, что указал мне в правильном направлении. Если кому-то еще нужна такая же функциональность, вот функция, которая преобразует путь к устройству:
#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string>
std::string getPhysicalDiskSerialNumber(const char *path) {
struct stat s;
char syspath[256];
syspath[0] = '\0';
stat(path,&s);
sprintf(syspath,"/sys/dev/block/%d:%d",major(s.st_dev),minor(s.st_dev));
struct udev *context = udev_new();
struct udev_device *device = udev_device_new_from_syspath(context, syspath);
const char *id = udev_device_get_property_value(device, "ID_SERIAL");
std::string serial = id;
// Cleanup
udev_device_unref(device);
udev_unref(context);
return serial;
}
fstat()
в файле возвращает struct stat
который содержит поле типа dev_t
. Есть макросы, которые извлекают старший и младший номера устройств. Они однозначно идентифицируют диск и раздел в системе.