[英]how in c check what exactly is under /dev/sda and what is under /dev/sdb when both are USB drives
[英]opendir for usb device /dev/sdb
我试图在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”),但是open调用总是失败。
您是否知道进行此检测的最佳方法是什么?
主要目标是在运行时程序中知道udev在何处安装硬盘,以及USB闪存驱动器(如果已插入)。 谢谢,冉
A)为什么您的opendir
调用失败? 很容易理解。 因为/dev/sdb
不是目录。 对我来说,当您尝试将设备作为目录打开时,很难理解您的期望。 如果你想从您的USB驱动器获取文件列表,你需要mount
的分区( /dev/sdb1
, /dev/sdb2
等没有/dev/sdb
)一些mount point
( directory
)。 如果成功挂载,则可以通过呼叫打开目录。 许多Linux发行版会自动安装USB驱动器。 您可以查看发行文档以获取有关USB驱动器自动安装的信息。
B)我认为很容易理解为什么用这种方法检测USB设备是个坏主意。
=>不同的计算机具有不同数量的驱动器。 因此,在许多计算机上, /dev/sdb
是硬盘驱动器。
=>假设您知道只有一个硬盘驱动器,则在计算机重新启动后,磁盘命名仍然可以更改,因此,重新启动后,usb驱动器将变为sda
,硬盘驱动器将变为sdb
(但通常不会发生) 。
=>通常,无法预测新字母( sdb
或sdc
或sde
)。
=>您无法访问不是USB驱动器的USB设备。
=>这种解决方案还有其他许多问题。
C)我不完全了解您的目标,但是如果您希望在插入USB设备后让程序采取一些措施,那么您可以采取的最佳解决方案是阅读udev
和发行版的事件系统。 如果要使用USB设备进行一些低级操作,可以阅读libusb
。 您可以使用lsusb
命令获取有关USB设备的一般信息,该命令通常是发行版的一部分。 您可以在Google上搜索其他一些推理程序命令。
设备/dev/sdb
不是目录,而只是设备,因此您应该使用stat
类的系统调用来告诉您文件是否存在,而不是尝试在文件上调用opendir
。
请注意, /dev/sdb
可以是任何类型的硬盘驱动器,具体取决于您特定系统的设置。 它不一定是USB驱动器。
或者,您可以执行lsusb
实用程序并解析其输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.