Linux 中,通过 C 语言读取硬件信息通常使用系统调用和读取 `/proc
Linux 系统中,通过 C 语言读取硬件信息是一项常见的任务,通常涉及访问系统文件、使用特定的库函数或调用系统命令,以下是一些常见的硬件信息获取方法及其实现方式。

CPU 信息
CPU 信息可以通过读取 /proc/cpuinfo 文件来获取,该文件包含了 CPU 的详细信息,如型号、核心数、频率等。
示例代码:
#include <stdio.h>
#include <stdlib.h>
void read_cpuinfo() {
FILE *fp;
char line[256];
fp = fopen("/proc/cpuinfo", "r");
if (fp == NULL) {
perror("Failed to open /proc/cpuinfo");
exit(EXIT_FAILURE);
}
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
fclose(fp);
}
int main() {
read_cpuinfo();
return 0;
}
内存信息
内存信息可以通过读取 /proc/meminfo 文件来获取,该文件包含了内存的总量、可用内存、缓存等信息。
示例代码:
#include <stdio.h>
#include <stdlib.h>
void read_meminfo() {
FILE *fp;
char line[256];
fp = fopen("/proc/meminfo", "r");
if (fp == NULL) {
perror("Failed to open /proc/meminfo");
exit(EXIT_FAILURE);
}
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
fclose(fp);
}
int main() {
read_meminfo();
return 0;
}
硬盘信息
硬盘信息可以通过调用 ioctl 函数或读取 /proc/partitions 和 /sys/block/ 目录下的文件来获取,以下是一个使用 ioctl 获取硬盘信息的示例。

示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
#include <unistd.h>
void get_disk_info(const char *device) {
int fd;
struct hd_driveid drive_info;
fd = open(device, O_RDONLY | O_NONBLOCK);
if (fd == -1) {
perror("Failed to open device");
exit(EXIT_FAILURE);
}
if (ioctl(fd, HDIO_GET_IDENTITY, &drive_info) == -1) {
perror("Failed to get disk info");
close(fd);
exit(EXIT_FAILURE);
}
printf("Model: %s
", drive_info.model);
printf("Serial: %s
", drive_info.serial_no);
printf("Heads: %d
", drive_info.heads);
printf("Sectors: %d
", drive_info.sectors);
printf("Cylinders: %d
", drive_info.cylinders);
printf("Total sectors: %d
", drive_info.lba_capacity);
close(fd);
}
int main() {
get_disk_info("/dev/sda");
return 0;
}
网络信息
网络信息可以通过读取 /sys/class/net/ 目录下的文件或调用 ioctl 函数来获取,以下是一个获取网络接口信息的示例。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <arpa/inet.h>
void get_network_info(const char *interface) {
int fd;
struct ifreq ifr;
struct sockaddr_in *addr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
perror("Failed to create socket");
exit(EXIT_FAILURE);
}
strncpy(ifr.ifr_name, interface, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ 1] = '