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系统如何快速配置SMTP服务?

    安装Postfix更新系统包sudo apt update # Ubuntu/Debiansudo yum update # CentOS/RHEL安装Postfixsudo apt install postfix # Ubuntu/Debiansudo yum install postfix # CentOS……

    2025年7月29日
    9400
  • 怎样快速查看Linux内存大小?

    通过 /proc/meminfo 文件(最底层数据)这是Linux内核提供的原始内存信息文件,所有工具的数据来源均基于此,操作步骤:cat /proc/meminfo | grep -i 'MemTotal'输出示例:MemTotal: 16248544 kB说明:MemTotal 表示物理内存……

    2025年7月4日
    12600
  • 如何查看系统主配置文件?

    查看定时任务(cron jobs)当前用户的定时任务crontab -l # 列出当前用户的计划任务若显示 no crontab for [user],表示该用户无定时任务,修改任务:crontab -e(需谨慎操作),系统级定时任务系统管理员配置的任务通常位于以下目录:# 查看所有系统计划任务(包括子目录)l……

    2025年7月27日
    10600
  • Linux系统下如何查看RAID5磁盘阵列的配置及运行状态?

    在Linux系统中查看RAID5阵列的状态、配置及磁盘健康情况,是系统管理和故障排查的重要环节,RAID5通过分布式奇偶校验实现数据冗余,至少需要3块磁盘,其中一块容量的磁盘用于存储奇偶校验信息,以下是查看RAID5的详细方法,涵盖软件RAID(基于Linux软件RAID,mdadm)和硬件RAID(基于阵列卡……

    2025年9月9日
    11300
  • Linux系统传文件,具体存放位置在哪里?

    在Linux系统中传输文件时,根据场景不同(本地设备、远程服务器等),传输方法和文件存放位置会有差异,本文将详细说明常见传输方式及文件存放逻辑,帮助你高效管理文件,本地文件传输:从U盘/移动硬盘到Linux系统当你需要通过物理设备(如U盘、移动硬盘)向Linux系统传文件时,核心步骤是“识别设备→挂载→复制→卸……

    2025年10月9日
    11100

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信