21xrx.com
2024-11-05 15:00:08 Tuesday
登录
文章检索 我的文章 写文章
Linux C++获取CPU ID
2023-06-22 14:00:01 深夜i     --     --
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的安全性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复