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] = '