opeb用于usb设备/ dev / sdb

时间:2014-07-09 06:15:18

标签: linux usb device opendir

我试图在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闪存驱动器(如果已插入)。 谢谢, 然

2 个答案:

答案 0 :(得分:2)

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

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

=>不同的计算机具有不同的驱动器数量所以在许多电脑上 directory - 是一个硬盘。

=>假设您知道只有一个硬盘驱动器,在重新启动计算机后,磁盘命名仍然可以更改,因此重启后USB驱动器可能会变为/dev/sdb,硬盘驱动器将变为{{1} (但通常情况并非如此)。

=>通常,无法预测新信件(sdasdbsdb)。

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

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

C)我没有完全理解你的目标,但是如果你希望你的程序在插入usb设备时采取一些行动,你可以做的最好的解决方案就是sdc和你的发行的事件系统。如果您想使用USB设备进行一些低级操作,可以阅读sde。您可以使用udev命令获取有关USB设备的一般信息,该命令通常是分发的一部分。您可以谷歌搜索其他一些推断命令。

答案 1 :(得分:0)

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

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