直接代码,有的电脑cpuid可能没有,代码头文件没有理清但是满足编译需求
std::string getcpuid() 来获取cpu id信息
std::string get_harddisk_info()来获取硬盘id
cpp
#include <unistd.h>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <arpa/inet.h>
#include <string>
#include <fstream>
#include <ifaddrs.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
//#include <linux/if.h>
#include <stdio.h>
#include <linux/hdreg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <net/if.h>
#include <sys/types.h>
#include <stdlib.h>
//
std::string getcpuid()
{
std::string strCPUId;
unsigned long s1,s2;
char buf[32] = {0};
asm volatile(
"movl $0x01, %%eax;"
"xorl %%edx, %%edx;"
"cpuid;"
"movl %%edx, %0;"
"movl %%eax, %1;"
:"=m"(s1), "=m"(s2)
);
std::cout << "" << std::endl;
if (s1) {
memset(buf, 0, 32);
snprintf(buf, 32, "%08X", s1);
strCPUId += buf;
}
//std::cout << "cpuid 2" << std::endl;
if (s2) {
memset(buf, 0, 32);
snprintf(buf, 32, "%08X", s2);
strCPUId += buf;
}
std::cout << "" << std::endl;
/*
asm volatile(
"movl $0x03, %%eax;"
"xorl %%ecx, %%ecx;"
"xorl %%edx, %%edx;"
"cpuid;"
"movl %%edx, %0;"
"movl %%ecx, %1;"
:"=m"(s1), "=m"(s2)
);
std::cout << "cpuid 4" << std::endl;
if (s1) {
memset(buf, 0, 32);
snprintf(buf, 32, "%08X", s1);
strCPUId += buf;
}
std::cout << "cpuid 5" << std::endl;
if (s2) {
memset(buf, 0, 32);
snprintf(buf, 32, "%08X", s2);
strCPUId += buf;
}
*/
return strCPUId;
}
static void parse_board_serial(const char * file_name, const char * match_words, std::string & board_serial)
{
board_serial.c_str();
std::ifstream ifs(file_name, std::ios::binary);
if (!ifs.is_open())
{
return;
}
char line[4096] = { 0 };
while (!ifs.eof())
{
ifs.getline(line, sizeof(line));
if (!ifs.good())
{
break;
}
const char * board = strstr(line, match_words);
if (NULL == board)
{
continue;
}
board += strlen(match_words);
while ('\0' != board[0])
{
if (' ' != board[0])
{
board_serial.push_back(board[0]);
}
++board;
}
if ("None" == board_serial)
{
board_serial.clear();
continue;
}
if (!board_serial.empty())
{
break;
}
}
ifs.close();
}
static bool get_board_serial_by_system(std::string & board_serial)
{
board_serial.c_str();
const char * dmidecode_result = ".dmidecode_result.txt";
char command[512] = { 0 };
snprintf(command, sizeof(command), "sudo dmidecode -t 2 | grep Serial > %s", dmidecode_result);
if (0 == system(command))
{
parse_board_serial(dmidecode_result, "Serial Number:", board_serial);
}
unlink(dmidecode_result);
return(!board_serial.empty());
}
static bool get_board_serial_number(std::string & board_serial)
{
//if (0 == getuid())
{
if (get_board_serial_by_system(board_serial))
{
return(true);
}
}
return(false);
}
std::string get_harddisk_info()
{
std::string board_serial;
if (get_board_serial_number(board_serial))
{
//printf("board_serial: [%s]\n", board_serial.c_str());
return board_serial;
}
else
{
//printf("can not get board id\n");
}
return "";
}