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

如何在C语言中实现PCI设备重扫描操作

解答

你提到的打开/sys/bus/pci/rescan文件调用write写入1的方案完全可行,这就是用户态触发PCI总线重扫描的标准实现方式,和你列的shell命令底层逻辑完全一致——shell执行echo 1 > /sys/bus/pci/rescan时,本质也是打开这个sysfs虚拟文件写入对应字节,没有特殊的额外逻辑。

实现注意要点

  • 权限要求:该sysfs节点仅root用户持有写权限,程序必须以root身份运行,否则打开文件时会直接触发Permission denied错误。
  • 写入内容要求:不需要写入整型数值1,仅需写入ASCII字符'1'即可,单字节长度就足够触发重扫描动作,写入多余内容不会产生额外效果。
  • 不推荐用system("echo 1 > /sys/bus/pci/rescan")的方式实现:一方面会额外fork进程产生不必要的开销,另一方面存在命令注入风险,错误处理也非常不可控。

参考实现代码

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int trigger_pci_rescan(void)
{
    int fd = open("/sys/bus/pci/rescan", O_WRONLY);
    if (fd < 0) {
        fprintf(stderr, "打开rescan节点失败: %s\n", strerror(errno));
        return -1;
    }

    char trigger_val = '1';
    if (write(fd, &trigger_val, 1) != 1) {
        fprintf(stderr, "写入重扫描触发值失败: %s\n", strerror(errno));
        close(fd);
        return -1;
    }

    close(fd);
    return 0;
}

int main()
{
    return trigger_pci_rescan() == 0 ? 0 : 1;
}

补充:如果不需要扫描整条PCI总线,仅需要重扫指定设备,可以打开对应设备路径下的rescan节点,比如/sys/bus/pci/devices/0000:01:00.0/rescan,用相同的写入逻辑即可触发单设备重扫描。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:39:19