如何用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; }
重要说明
- 获取网卡名称:执行
ip link show命令,找到对应r8152驱动的网卡(通常名称包含usb字样,比如enp0s20u9),替换代码中的网卡名。 - 头文件依赖:必须包含指定的头文件,否则结构体和宏定义会报错。
- 权限问题:运行程序需要足够权限,建议用
sudo执行,避免因权限不足导致ioctl失败。
内容的提问来源于stack exchange,提问作者Mukul Mehra
相关产品推荐
相关产品推荐

