在使用 Windows 时,可以使用命令获取硬盘分区的(或多或少唯一的)序列号。
GetVolumeInformation()
示例代码:
#include <iostream>#include <windows.h>
#include <stdio.h>int main(int argc, char **argv)
{DWORD VolumeSerialNumber;char VolumeName[256];GetVolumeInformation("c:\\ ", VolumeName, 12, &VolumeSerialNumber, NULL, NULL, NULL, 10);printf("c盘的卷标:%s\n ", VolumeName);printf("c盘的序列号:%lu\n ", VolumeSerialNumber);return 0;
}
结果:
c盘的卷标:Windows
c盘的序列号:3831598124
Linux 有类似的东西吗?获得硬件设备的唯一编码,并且可以通过编程方式检索?
解决方案:
在 linux 中,可以使用 blkid 命令获取分区的 UUID:
# sudo blkid /dev/sda1
/dev/sda1: UUID="007258df-98ea-47de-b906-35997ea63509" TYPE="ext4" PARTUUID="5c1bef5e-01"
此信息以特定分区类型(如 ext4、xfs)的格式存储,并在重新格式化时发生变化。
如果需要从代码中调用它,调用一个 shell 来运行这个命令并不是最好的方法,但它可以工作:
// main.cpp
#include <stdio.h>int main(int argc,char ** argv)
{/* device you are looking for */ char device[]="/dev/sda1";/* buffer to hold info */char buffer[1024];/* format into a single command to be run */sprintf(buffer,"/sbin/blkid -o value %s",device);/* run the command via popen */FILE *f=popen(buffer,"r");/* probably should check to make sure f!=null *//* read the first line of output */fgets(buffer,sizeof(buffer),f);/* print the results (note, newline is included in string) */fprintf(stdout,"uuid is %s",buffer);
}
CMakeLists.txt
# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)# 声明一个 cmake 工程
project(blkid_sd)# 设置编译模式
set(CMAKE_BUILD_TYPE "RELEASE")# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable(blkid_sd main.cpp)
执行命令:
mkdir build
cd build
cmake ..
make -j4
sudo ./blkid_sd
=> uuid is 007258df-98ea-47de-b906-35997ea63509
关于c++获取硬盘/分区序列号,在Stack Overflow有一个类似的问题: c++ - Get HD/Partition serial number - Stack Overflow。