C 在Linux中使用libudev以编程方式枚举USB闪存驱动器

C 在Linux中使用libudev以编程方式枚举USB闪存驱动器,c,linux,usb,udev,C,Linux,Usb,Udev,如何在Linux下使用libudev以编程方式枚举所有USB闪存驱动器?我想获取诸如“/dev/sdb4”之类的字符串,这样我就可以使用“mount()”来装载它们 我当时正在学习libudev的例子。示例代码适用于“hidraw”;然后我尝试了“usb”、“scsi\u disk”、“scsi\u generic”等,但没有起作用-它没有像“/dev/sdb4”那样列出“设备路径”,它说“设备节点路径:(null)”。而不是scsi\u generic搜索块子节点。在那里,您应该可以找到块设备

如何在Linux下使用libudev以编程方式枚举所有USB闪存驱动器?我想获取诸如“
/dev/sdb4
”之类的字符串,这样我就可以使用“
mount()
”来装载它们


我当时正在学习libudev的例子。示例代码适用于“
hidraw
”;然后我尝试了“
usb
”、“
scsi\u disk
”、“
scsi\u generic
”等,但没有起作用-它没有像“
/dev/sdb4
”那样列出“设备路径”,它说“
设备节点路径:(null)
”。

而不是
scsi\u generic
搜索
子节点。在那里,您应该可以找到块设备

scsi\u generic
是一个不同的接口

我会补充一点解释,但请注意,我不是这方面的专家,只是一个观察者

SCSI设备非常复杂,有不同的几个接口来访问不同的功能集

scsi\u generic
设备是一种字符设备(通常命名为
/dev/sg
),用于访问scsi功能。例如,CD/DVD刻录机通常通过该设备进行管理。但是,对数据块的访问是通过标准块设备使用的,因此每个看起来像磁盘的SCSI设备(请记住,还有SCSI打印机…)也将创建一个块子节点

但是USB闪存驱动器不是真正的SCSI设备,它只是使用相同的协议,非常简单。因此,为了避免为USB重写相同的协议,内核创建一个虚拟SCSI设备并将其连接到USB设备


这种虚拟SCSI设备的问题在于,它们具有将自己呈现为块设备所需的最少数量。因此,缺少许多SCSI特有的功能,特别是
SCSI\u通用接口。这就是为什么在那里会出现
(null)
。这并不是说它对您有用,因为您无法挂载
scsi\u generic
设备,因为它根本不是块设备

我不知道答案。我只想说我喜欢“列举”这个词,就这样。@Wang Tuma我也在做类似的事情。我也有同样的问题。我用了“block”,它列出了所有的驱动器。。我只想要usb闪存驱动器。。。有没有一种方法可以连接usb闪存驱动器??请看一看是的“积木”作品!但是为什么呢?实际上我认为“scsi_磁盘”是正确的子节点。请你再解释一下好吗?谢谢。@WangTuma:当然可以!我补充了一些解释。是的,这很有帮助!谢谢