您的位置:首页 > 运维架构 > Linux

获取linux下CPU、网卡、硬盘ID

2017-02-23 20:11 337 查看
获取linux下CPU、网卡、硬盘ID

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <net/if.h>
#include <linux/hdreg.h>

static char* get_cpu(char *szCpuId){
unsigned long s1,s2,s3,s4;
char string[128];
char p1[128], p2[128];
unsigned int eax = 0;
unsigned int ebx,ecx,edx;
asm volatile
("movl $0x01 , %%eax ; \n\t"
"xorl %%edx , %%edx ;\n\t"
"cpuid ;\n\t"
"movl %%edx ,%0 ;\n\t"
"movl %%eax ,%1 ; \n\t"
:"=m"(s1),"=m"(s2)
);
sprintf((char *)p1, "%08X%08X", htonl(s2), htonl(s1));
sprintf(szCpuId, "%c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c",
p1[0],p1[1],p1[2],p1[3],p1[4],p1[5],p1[6],p1[7],
p1[8],p1[9],p1[10],p1[11],p1[12],p1[13],p1[14],p1[15]);
}

int get_mac(char* mac, char* eth0)
{
struct ifreq tmp;
int sock_mac;
char mac_addr[30];
sock_mac = socket(AF_INET, SOCK_STREAM, 0);
if( sock_mac == -1){
sprintf(mac, "create socket fail\n");
return -1;
}
memset(&tmp, 0, sizeof(tmp));
strncpy(tmp.ifr_name, eth0, strlen(eth0)-2);
//strncpy(tmp.ifr_name, "eno16777736", sizeof(tmp.ifr_name)-1);

if((ioctl( sock_mac, SIOCGIFHWADDR, &tmp)) < 0 ){
sprintf(mac, "mac ioctl error\n");
return -1;
}
sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X",
(unsigned char)tmp.ifr_hwaddr.sa_data[0],
(unsigned char)tmp.ifr_hwaddr.sa_data[1],
(unsigned char)tmp.ifr_hwaddr.sa_data[2],
(unsigned char)tmp.ifr_hwaddr.sa_data[3],
(unsigned char)tmp.ifr_hwaddr.sa_data[4],
(unsigned char)tmp.ifr_hwaddr.sa_data[5]
);
close(sock_mac);
return 1;
}
static int getdiskid(char *diskid){
int fd;
struct hd_driveid hid;
fd = open("/dev/sda", O_RDONLY);
if(fd < 0){
sprintf(diskid, "%s", "open error");
return -1;
}
if(ioctl(fd, HDIO_GET_IDENTITY, &hid) < 0){
sprintf(diskid, "%s", "ioctl error");
return -1;
}
close(fd);
char tmp[sizeof(hid.serial_no)];
sprintf(tmp,"%s", hid.serial_no);
int t = sizeof(hid.serial_no) - sizeof(diskid);
strncpy(diskid, tmp+t, sizeof(tmp));

return 0;
}

int main(int argc, char* argv[])
{
char cpuId[50];
get_cpu(cpuId);
printf("\nCpuID: %s\n", cpuId);
char macId[50], eth[20];
system("ifconfig | head -n 1 | cut -d ' ' -f1 > temp");
FILE *fp =fopen("temp", "r");
if(fp == NULL)
return -1;
int t = 0;
while(fscanf(fp, "%c", ð[t++])!=EOF);
get_mac(macId, eth);
printf("MacID: %s\n", macId);
system("rm -rf temp");
char diskid[50];
getdiskid(diskid);
printf("DiskID: %s\n\n", diskid);
return 0;
}


获取网卡ID,有其他方法,待修改,,,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux