【问题标题】:opendir for usb device /dev/sdb用于 USB 设备 /dev/sdb 的 opendir
【发布时间】:2014-07-09 06:15:18
【问题描述】:

我正在尝试在 c 程序中实现一种检测 USB 是否连接的方法。 我注意到,当 USB 连接时,shell 中的以下命令将产生如下结果:

root:~# ls /dev/sdb
/dev/sdb

如果 USB 断开连接,我会得到

root:~# ls /dev/sdb
ls: /dev/sdb: No such file or directory

因此我假设检测从 c 程序连接的 USB 的最佳方法是执行 opendir("/dev/sdb"),但打开调用总是失败。

您知道进行此检测的最佳方法是什么吗?

主要目标是在运行时程序中了解 udev 安装硬盘的位置以及 USB 闪存驱动器(如果已插入)的位置。 谢谢, 然

【问题讨论】:

  • 你为什么不使用 udev ?我认为它的意思是。
  • 谢谢,我会阅读有关 udev 的更多信息。它还能告诉我设备的安装位置吗?

标签: linux usb device opendir


【解决方案1】:

A) 为什么您的opendir 呼叫失败?这很容易理解。因为/dev/sdb 不是目录。对我来说,当您尝试将设备作为目录打开时,很难理解您的期望。如果您想从 USB 驱动器获取文件列表,您需要将mount 分区(/dev/sdb1/dev/sdb2 等,而不是/dev/sdb)到一些mount pointdirectory)。如果你成功挂载它,那么你可以用你的调用打开目录。许多 linux 发行版会自动挂载 USB 驱动器。您可以查看您的分发文档以获取有关自动安装 USB 驱动器的信息。

B) 我认为很容易理解为什么以这种方式检测 USB 设备是个坏主意。

=> 不同的计算机有不同数量的驱动器。所以在很多电脑上 /dev/sdb - 是硬盘。

=> 假设你知道只有一个硬盘驱动器,重启后磁盘命名仍然可以改变,所以重启后USB驱动器可能会变成sda,而硬盘驱动器会变成sdb(但是通常这不会发生)。

=> 通常,无法预测新字母(sdbsdcsde)。

=> 您无法访问非 USB 驱动器的 USB 设备。

=> 这种解决方案还有很多其他问题。

C) 我没有完全理解您的目标,但是如果您希望您的程序在 USB 设备已插入的情况下执行某些操作,那么您可以做的最佳解决方案是阅读有关 udev 和事件系统的信息你的分布。如果你想用你的 USB 设备做一些低级操作,你可以阅读libusb。您可以使用lsusb 命令获取有关 USB 设备的一般信息,该命令通常是发行版的一部分。你可以用谷歌搜索其他一些推断命令。

【讨论】:

  • 嗨,这是嵌入式产品,我需要程序需要知道哪个设备是硬盘(正如您大部分时间所说的 sda - 硬盘),哪个是 USB 存储可移动设备(可能是 sdb )。总而言之,我需要知道硬盘在哪里,USB闪存驱动设备在哪里(仅在插入时才相关)。谢谢,冉
  • udev 自动挂载两者。有什么方法可以查询 udev,它安装硬盘的位置以及 USB 闪存驱动器的位置?
  • 查看libudev文档,如果你想用你的应用程序查询信息。我发现了一个可能有用的教程。 signal11.us/oss/udev 但是如果您只需要在插入时对文件进行一些操作,最好添加一个在 udev 规则中执行操作的脚本。
  • 对于嵌入式系统,你也可以使用mdev,它比udev轻。
【解决方案2】:

设备/dev/sdb 不是一个目录,它只是一个设备,所以你应该使用像stat 这样的系统调用,它会告诉你文件是否存在,而不是尝试在它上面调用opendir
请注意,/dev/sdb 可以是任何类型的硬盘,具体取决于您特定系统的设置;它不一定是 USB 驱动器。

或者,您可以执行lsusb 实用程序并解析其输出。

【讨论】:

  • fstat 以 fd 作为第一个参数,而且设备文件的存在并不意味着 USB 已连接,特别是对于嵌入式系统,有时嵌入式系统使用静态设备文件,所以 fstat 不是一个好主意,我我对吗?在我看来,他应该使用 mdev/udev,而 lsusb 将有助于制定 udev 规则。
  • 糟糕,我将其更改为 stat 而不是 fstat。我不知道这些静态设备文件,但即使这是真的,OP 也可能避免在他的机器上使用该功能。他明确告诉我们 sdb 仅在插入他的 USB 设备时才存在,他并没有说这需要成为所有系统的通用解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多