You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ethtool_drvinfo收集网卡驱动信息?调用ioctl失败求助

问题分析与修复方案

你的代码无法获取驱动信息的核心原因是未指定目标网络接口名称,另外还有几处细节需要修正:

关键问题点

  • 未将具体网卡名(如eth0、enp0s20u9)填入ethtool_drvinfo的ifname字段,内核不知道要查询哪个设备
  • 缺少必要的错误处理,无法定位失败原因
  • 代码存在语法错误(末尾多余的反引号)

修正后的完整代码

#include <sys/socket.h>
#include <linux/ethtool.h>
#include <linux/sockios.h>
#include <net/if.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    int socketfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (socketfd == -1) {
        perror("socket creation failed");
        return 1;
    }

    struct ethtool_drvinfo drvrinfo = {0};
    drvrinfo.cmd = ETHTOOL_GDRVINFO;
    // 替换为你的实际网卡名称,可通过ip link show查看
    strncpy(drvrinfo.ifname, "enp0s20u9", IFNAMSIZ - 1);
    drvrinfo.ifname[IFNAMSIZ - 1] = '\0'; // 确保字符串终止

    int ret = ioctl(socketfd, SIOCETHTOOL, &drvrinfo);
    if (ret == -1) {
        perror("ioctl ETHTOOL_GDRVINFO failed");
        close(socketfd);
        return 1;
    }

    // 打印获取到的驱动信息
    printf("Driver: %s\n", drvrinfo.driver);
    printf("Version: %s\n", drvrinfo.version);
    printf("Firmware Version: %s\n", drvrinfo.fw_version);
    printf("Bus Info: %s\n", drvrinfo.bus_info);

    close(socketfd);
    return 0;
}

重要说明

  1. 获取网卡名称:执行ip link show命令,找到对应r8152驱动的网卡(通常名称包含usb字样,比如enp0s20u9),替换代码中的网卡名。
  2. 头文件依赖:必须包含指定的头文件,否则结构体和宏定义会报错。
  3. 权限问题:运行程序需要足够权限,建议用sudo执行,避免因权限不足导致ioctl失败。

内容的提问来源于stack exchange,提问作者Mukul Mehra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:25:28