是否有一种安全的方法将文件系统路径映射到 /sys/block/ 节点。
例如在我的系统(Ubuntu)上,我的 / 路径是从 /dev/disk/by-uuid/7f6a93a7-1e63-48a3-a7e3-b336a2f9dbf7 挂载的,它是 /dev/sda1 的符号链接,而 /dev/sda1 是 /dev/sda 的一个分区,映射到 /sys/block/sda
我如何从:
/ -> /sys/block/sda
以一种我可以依赖的安全方式在所有发行版中工作?
答案1
fstat()
文件返回一个struct stat
包含 类型的字段dev_t
。有一些宏可以提取主设备号和次设备号。它们唯一地标识了系统上的驱动器和分区。
答案2
感谢 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;
}