linux如何通过c读取硬件信息

Linux 中,通过 C 语言读取硬件信息通常使用系统调用和读取 `/proc

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

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 获取硬盘信息的示例。

linux如何通过c读取硬件信息

示例代码:

#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] = '';
    if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) {
        perror("Failed to get IP address");
        close(fd);
        exit(EXIT_FAILURE);
    }
    addr = (struct sockaddr_in *)&ifr.ifr_addr;
    printf("IP Address: %s
", inet_ntoa(addr->sin_addr));
    if (ioctl(fd, SIOCGIFNETMASK, &ifr) == -1) {
        perror("Failed to get netmask");
        close(fd);
        exit(EXIT_FAILURE);
    }
    addr = (struct sockaddr_in *)&ifr.ifr_netmask;
    printf("Netmask: %s
", inet_ntoa(addr->sin_addr));
    close(fd);
}
int main() {
    get_network_info("eth0");
    return 0;
}

显卡信息

显卡信息可以通过读取 /proc/fb 或调用 driglx API 来获取,以下是一个使用 driglx 获取显卡信息的示例。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <GL/glx.h>
#include <GL/glxext.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xpresent.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xshape.h>
#include <X11/extensions/Xsync.h>
#include <X11/extensions/Xinput2.h>
#include <X11/extensions/Xinerama.h>
#include <X11/extensions/Xkb.h>
#include <X11/extensions/Xcms.h>
#include <X11/extensions/Xprint.h>
#include <X11/extensions/Xpn.h>
#include <X11/extensions/Xmng.h>
#include <X11/extensions/Xv.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/XIE.h>
#include <X11/extensions/Xres.h>
#include <X11/extensions/Xtest.h>
#include <X11/extensions/Xsec.h>
#include <X11/extensions/Xscrnsaver.h>
#include <X11/extensions/Xss.h>
#include <X11/extensions/Xtrapv.h>
#include <X11/extensions/Xrecord.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xpresent.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xshape.h>
#include <X11/extensions/Xsync.h>
#include <X11/extensions/Xinput2.h>
#include <X11/extensions/Xinerama.h>
#include <X11/extensions/Xkb.h>
#include <X11/extensions/Xcms.h>
#include <X11/extensions/Xprint.h>
#include <X11/extensions/Xpn.h>
#include <X11/extensions/Xmng.h>
#include <X11/extensions/Xv.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/XIE.h>
#include <X11/extensions/Xres.h>
#include <X11/extensions/Xtest.h>
#include <X11/extensions/Xsec.h>
#include <X11/extensions/Xscrnsaver.h>
#include <X11/extensions/Xss.h>
#include <X11/extensions/Xtrapv.h>
#include <X11/extensions/Xrecord.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xpresent.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xshape.h>
#include <X11/extensions/Xsync.h>
#include <X11/extensions/Xinput2.h>
#include <X11/extensions/Xinerama.h>
#include <X11/extensions/Xkb.h>
#include <X11/extensions/Xcms.h>
#include <X11/extensions/Xprint.h>
#include <X11/extensions/Xpn.h>
#include <X11/extensions/Xmng.h>
#include <X11/extensions/Xv.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/XIE.h>
#include <X11/extensions/Xres.h>
#include <X11/extensions/Xtest.h>
#include <X11/extensions/Xsec.h>
#include <X11/extensions/Xscrnsaver.h>
#include <X11/extensions/Xss.h>
#include <X11/extensions/Xtrapv.h>
#include <X11/extensions/Xrecord.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xpresent.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xshape.h>
#include <X11/extensions/Xsync.h>
#include <X11/extensions/Xinput2.h>
#include <X11/extensions/Xinerama.h>
#include <X11/extensions/Xkb.h>
#include <X11/extensions/Xcms.h>
#include <X11/extensions/Xprint.h>
#include <X11/extensions/Xpn.h>
#include <X11/extensions/Xmng.h>
#include <X11/extensions/Xv.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/XIE.h>
#include <X11/extensions/Xres.h>
#include <X11/extensions/Xtest.h>
#include <X11/extensions/Xsec.h>
#include <X11/extensions/Xscrnsaver.h>
#include <X11/extensions/Xss.h>
#include <X11/extensions/Xtrapv.h>
#include <X11/extensions/Xrecord.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xpresent.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xshape.h>
#include <X11/extensions/Xsync.h>
#include <X11/extensions/Xinput2.h>
#include <X11/extensions/Xinerama.h>
#include <X11/extensions/Xkb.h>
#include <X11/extensions/Xcms.h>
#include <X11/extensions/Xprint.h>
#include <X11/extensions/Xpn.h>
#include <X11/extensions/Xmng.h>
#include <X11/extensions/Xv.h>
#include <X11/extensions/XvMC.h>
#include <X11/extensions/XIE.h>
#include <X11/extensions/Xres.h>
#include <X11/extensions/Xtest.h>
#include <X11/extensions/Xsec.h>
#include <X11/extensions/Xscrnsaver.h>
#include <X11/extensions/Xss.h>
#include <X11/extensions/Xtrapv.h>
#include <X11/extensions/Xrecord.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xpresent.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xshape.h>
#include <X11/extensions/Xsync.

以上内容就是解答有关linux如何通过c读取硬件信息的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。

linux如何通过c读取硬件信息

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/13477.html

(0)
酷番叔酷番叔
上一篇 2025年8月19日 15:06
下一篇 2025年8月19日 15:11

相关推荐

  • Linux如何用ping命令诊断网络?

    基础用法基本命令格式ping [目标地址]示例: ping www.google.com输出示例:64 bytes from 142.250.179.196: icmp_seq=1 ttl=118 time=15.3 ms关键参数解析| 参数 | 作用 | 示例……

    2025年7月28日
    14500
  • Linux如何查看解压进度或结果?

    在Linux系统中,压缩文件是数据存储和传输的常见形式,掌握查看和解压技巧能显著提升工作效率,无论是日常管理服务器还是处理个人文件,了解如何识别压缩类型、预览内容以及正确解压都是必备技能,本文将详细讲解Linux环境下查看和解压各类压缩文件的方法,涵盖常用命令、选项及实用技巧,查看压缩文件基本信息在解压前,通常……

    2025年10月6日
    11000
  • 如何快速将大文件分卷压缩成2GB?

    为什么需要分包压缩?突破单文件大小限制(如FAT32文件系统最大4GB)分割大文件便于网络传输分卷备份降低存储风险兼容不同存储介质常用工具及操作步骤使用 tar + split(推荐原生方案)场景:压缩并分割超大目录/文件步骤:# 合并分卷并解压cat output.tar.gz.part* | tar -xv……

    2025年7月26日
    16200
  • Linux如何将失败命令的输出保存到文件?

    在Linux系统中,将失败命令的输出保存到文件是脚本调试、错误日志记录和系统监控的常见需求,所谓“失败命令”,通常指返回非0退出状态的命令(Linux中成功退出状态为0,失败为1-255),以下从基础重定向到高级脚本技巧,详细说明如何实现这一目标,并附实用示例和对比表格,基础重定向:利用和&>捕获……

    2025年8月24日
    13300
  • Linux安装.sh软件安全吗?

    安装前的关键准备验证来源可靠性仅从软件官网或受信任的渠道(如GitHub官方仓库、项目官网)下载.sh文件,检查文件哈希值(如SHA256)是否与官网提供的一致: sha256sum 文件名.sh # 对比官网公布的校验值检查脚本内容(重要安全步骤)使用文本编辑器预览脚本,避免恶意代码:nano 文件名.sh……

    2025年6月19日
    15600

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信