在Linux系统中,通过C语言读取硬盘序列号通常涉及到对/sys/block
目录下的设备信息或者使用udev
规则的访问。以下是基础概念和相关操作:
可以通过读取/sys/block/sda/device/serial
这样的路径来获取硬盘序列号,其中sda
是硬盘的设备名,可能会有所不同。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *fp;
char path[256];
char serial[64];
// 假设硬盘设备名为sda,实际情况可能需要遍历/sys/block目录来确定
snprintf(path, sizeof(path), "/sys/block/sda/device/serial");
fp = fopen(path, "r");
if (fp == NULL) {
perror("Failed to open serial file");
return EXIT_FAILURE;
}
if (fgets(serial, sizeof(serial), fp) != NULL) {
// 移除可能的换行符
serial[strcspn(serial, "
")] = 0;
printf("Serial Number: %s
", serial);
} else {
perror("Failed to read serial number");
}
fclose(fp);
return EXIT_SUCCESS;
}
可以通过libudev
库来查询硬盘的序列号,这种方法更为通用,可以处理多块硬盘的情况。
#include <libudev.h>
#include <stdio.h>
int main(void) {
struct udev *udev;
struct udev_enumerate *enumerate;
struct udev_list_entry *devices, *dev_list_entry;
struct udev_device *dev;
// 创建udev上下文
udev = udev_new();
if (!udev) {
printf("Can't create udev
");
return 1;
}
// 创建枚举对象
enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "block");
udev_enumerate_scan_devices(enumerate);
// 获取设备列表
devices = udev_enumerate_get_list_entry(enumerate);
udev_list_entry_foreach(dev_list_entry, devices) {
const char *path = udev_list_entry_get_name(dev_list_entry);
dev = udev_device_new_from_syspath(udev, path);
const char *serial = udev_device_get_property_value(dev, "ID_SERIAL_SHORT");
if (serial) {
printf("Serial Number: %s
", serial);
} else {
printf("Serial number not found
");
}
udev_device_unref(dev);
}
// 清理
udev_enumerate_unref(enumerate);
udev_unref(udev);
return 0;
}
sda
, sdb
等,需要动态获取。如果在读取硬盘序列号时遇到问题,可以:
libudev
。lsblk
或fdisk -l
命令确认硬盘的设备名。sysfs
和udev
。dmesg
,看是否有相关错误信息。以上就是在Linux系统中使用C语言读取硬盘序列号的基础概念、方法和注意事项。
领取专属 10元无门槛券
手把手带您无忧上云