21xrx.com
2025-03-17 02:47:37 Monday
文章检索 我的文章 写文章
Linux C++获取CPU ID
2023-06-22 14:00:01 深夜i     53     0
Linux C++ CPU ID 获取

在开发过程中,获取CPU的ID是一项非常重要的技术。理由是,CPU的ID可以用于唯一识别一台机器,并且在许多应用程序中,使用CPU ID可以帮助开发人员进行软件许可管理。

下面我们将介绍如何在Linux上使用C++获取CPU的ID。首先,我们需要了解一下CPU ID的定义,它实际上是CPU唯一识别号(CPU serial number),是由CPU厂商在制造时向芯片中写入的一串字符串。每个CPU的识别号都是不同的,这就意味着我们可以通过识别号来区分不同的CPU。目前,大多数CPU厂商(如Intel和AMD)已经停止在芯片中写入识别号,这意味着现代CPU通常不再具有唯一的识别号。但是,我们仍然可以通过其他方法获取机器的唯一标识。

现在,我们将介绍两个主要的方法用于获取机器ID:MAC地址和硬盘序列号。

获取MAC地址

MAC地址是网络接口的硬件地址,它是由网络设备厂商在制造时写入网络设备的一串字符串,每个网络设备的MAC地址都是唯一的。因此,我们可以通过获取机器的MAC地址来唯一识别机器。

要获取MAC地址,我们需要用到SIOCGIFHWADDR命令,它是Linux中获取网络设备信息的一个系统调用。SIOCGIFHWADDR命令需要一个ifreq结构体,它包含网络设备名称和MAC地址信息。下面是获取MAC地址的示例代码:

#include <stdio.h>
#include <string.h>
#include <ifaddrs.h>
#include <net/if.h>
int main()
{
  struct ifaddrs *ifaddr, *ifa;
  int family, s;
  char host[NI_MAXHOST];
  if (getifaddrs(&ifaddr) == -1) {
    perror("getifaddrs");
    return -1;
  }
  for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr == NULL)
      continue;
    
    family = ifa->ifa_addr->sa_family;
    if (family == AF_PACKET && strcmp(ifa->ifa_name,"lo")!=0) {
      s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
      if (s == -1)
        return -1;
      
      struct ifreq req;
      strncpy(req.ifr_name, ifa->ifa_name, IFNAMSIZ);
      if (ioctl(s, SIOCGIFHWADDR, &req) == -1)
        return -1;
      
      memcpy(host, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
      printf("MAC for %s is ", ifa->ifa_name);
      for (int i = 0; i < 6; i++) {
        printf("%02x", (unsigned char) host[i]);
        if (i < 5) {
          printf(":");
        }
      }
      printf("\n");
      close(s);
    }
  }
  freeifaddrs(ifaddr);
  return 0;
}

硬盘序列号

硬盘的序列号是由硬盘厂商在制造时写入硬盘中的一串字符串,每个硬盘的序列号都是唯一的。因此,我们可以通过获取硬盘的序列号来唯一识别机器。

要获取硬盘序列号,我们需要用到ioctl命令和HDIO_GET_IDENTITY特性。下面是获取硬盘序列号的示例代码:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
int main()
{
  int fd = open("/dev/sda", O_RDONLY|O_NONBLOCK);
  if (fd == -1) {
    perror("Could not open device");
    return -1;
  }
  struct hd_driveid id;
  if (ioctl(fd, HDIO_GET_IDENTITY, &id) == -1) {
    perror("Could not get hard disk ID");
    return -1;
  }
  printf("Serial number: %s\n", id.serial_no);
  close(fd);
  return 0;
}

以上是两种获取机器唯一标识的方法。需要注意的是,在生产环境中,我们需要根据实际需求选择不同的方法获取机器ID,并且需要注意保护机器ID的安全性。

  
  

评论区

请求出错了