【发布时间】: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