【问题标题】:Write into /sys/bus/usb/drivers_probe with C++ application使用 C++ 应用程序写入 /sys/bus/usb/drivers_probe
【发布时间】:2020-07-16 22:25:59
【问题描述】:

我正在尝试制作应该阻止某些 USB 设备的 C/C++ 应用程序。

我有类似的问题描述了here,但现在我需要将该解决方案实现到 C++ 中。我只需要将一些字符串写入/sys/bus/usb/drivers_probe。我试过类似的东西:

ofstream fDriversProbe;
fDriversProbe.open("/sys/bus/usb/drivers_probe", ios::out | ios::binary | ios::app);

if(!fDriversProbe)
{
   cout << "Could not open file drivers_probe.";
}

fDriversProbe.write("1-1:1.1", strlen("1-1:1.1"));

if(!fDriversProbe.good())
{
   cout << "Could not write data to file\n";
}

不会带来任何错误或警告,但似乎也不起作用。

然后我决定从代码中执行工作命令。

system("sudo sh -c \"echo 1-1:1.1 > /sys/bus/usb/drivers_probe\"");

system("echo 1-1:1.1 | sudo tee /sys/bus/usb/drivers_probe");

没有运气。当我从终端手动执行相同的命令(具有相同的界面)时,一切正常,USB 设备开始工作。

【问题讨论】:

  • 没有运气意味着“无法打开文件 drivers_probe”、“无法将数据写入文件”或一切正常但设备无法按预期工作(以及预期的确切情况)?我看到一些使用 POSIX 开放的成功案例 here
  • 一切似乎都很好,界面写入输出(与在终端中使用该命令时的行为相同)并且没有错误或警告。 USB 设备根本不工作,因为从 C++ 执行的命令由于未知原因未触发驱动程序绑定。谢谢,我会尽快使用 POSIX open() 尝试该解决方案,并会通知您。
  • 您是否尝试过使用echo 命令从shell 没有 C++ 程序写入文件?如果这可行,那么问题可能出在您的 C++ 程序中,但如果即使是普通的 echo 也不起作用,那么问题就出在其他地方
  • @pptaszni 我尝试使用 open() 和 write(),但仍然没有。文件似乎已成功打开,程序成功地将 7 个字节(正确的接口长度)写入该文件。驱动程序绑定仍未触发。我不明白我的代码和这个命令 echo "1-1:1.1" | sudo tee /sys/bus/usb/drivers_probe 有什么不同,它正在工作。
  • @Tsyvarev 是的,正如我提到的(我帖子的最后一句话),这两个命令 100% 有效。触发驱动程序绑定是我的应用程序的最后一步,所以如果我在应用程序完成后从 shell 手动运行这些命令之一,一切似乎都很好并且工作正常。这很奇怪,我不明白为什么至少这个解决方案不能在 C++ 代码中工作。我正在使用 sudo 运行我的 C++ 应用程序,所以我想这应该不是特权问题。

标签: c++ linux linux-kernel usb


【解决方案1】:

您是否尝试在每次写入后刷新 ofstream 对象,即 fDriversProbe.flush()。我有类似的问题,我试图使用驱动程序导出的 sysfs 属性提供相机快门和增益参数,但设置没有到达驱动程序。伴随写入 sysfs 文件和随后的刷新解决了我的问题。

【讨论】:

  • 这正是我的想法。我已经尝试过了,每次我尝试写东西时都会重新打开该文件,但没有任何改变。我发现的唯一解决方案是使用 popen。所以想像popen("sudo tee /sys/bus/usb/drivers_probe &gt; /dev/null", "w") 然后使用write() 写入该流。不是我喜欢的解决方案,但到目前为止它正在发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多