在Linux下如何确定USB存储器(USB闪存盘)的“设备path”

我怎么能编程枚举所有的USB存储在Linux下使用C? 我想得到'/ dev / sdb4'这样的string,然后我可以使用mount()来挂载它们。

我想有一些方法来列出所有的USB设备,但我只想要USB存储。

另外,我们可以区分一个USB闪存驱动器(直接插入机器的USB端口)和一个USB磁盘(通常通过USB电缆连接到本机)?

谢谢。

您可以从目录/proc/scsi/usb-storage找到所有USB存储设备。 通过列出此目录的内容,您可以找出SCSI主机设备编号,然后准备检查文件/sys/class/scsi_disk/N:*:*:*其中N是SCSI主机设备的编号。 /sys/class/scsi_disk/中的文件是实际设备目录的链接。

接下来的是这样做的一种方式,虽然它不是最好的。 我想你可能想依靠一个自动加载器,而不是手工编写这个代码。

根据你所附的什么特定的磁盘设备(在你的例子中列出了两个)进行混合和匹配的部分留给读者练习。

 #include <stdio.h> #include <dirent.h> #include <errno.h> #include <string.h> #include <libgen.h> #include <linux/limits.h> #include <glob.h> #include <unistd.h> #define PROC_USB_DEV "/proc/scsi/usb-storage" #define SYS_SCSI_HOST "/sys/class/scsi_host/host%s/device" #define SYS_SCSI_DEV "/sys/class/scsi_disk/%s:*" #define SYS_SCSI_TGT "%s/device/block/*" int main(int argc, char **argv) { DIR *dp = NULL; struct dirent *dt = NULL; if((dp = opendir(PROC_USB_DEV)) == NULL) { fprintf(stderr, "Can not open %s: %s", PROC_USB_DEV, strerror(errno)); return 2; } /* find usb storage device hosts which appear as scsi hosts */ /* for the sake of example this one hasn't been done with glob(3) */ while((dt = readdir(dp)) != NULL) { int scsi_dev = 0; /* skip '.' and '..', possibly others too */ if((scsi_dev = atoi(basename(dt->d_name))) < 1) continue; char buf[PATH_MAX]; char pat[PATH_MAX]; snprintf(buf, PATH_MAX, SYS_SCSI_HOST, basename(dt->d_name)); snprintf(pat, PATH_MAX, SYS_SCSI_DEV, basename(dt->d_name)); glob_t hosts; size_t count; /* find SCSI host device paths */ glob(pat, 0, 0, &hosts); if(hosts.gl_pathc > 0) { char **p; int n; for(p = hosts.gl_pathv, n = hosts.gl_pathc; n; p++, n--) { char tgtbuf[PATH_MAX + NAME_MAX]; snprintf(tgtbuf, PATH_MAX + NAME_MAX, SYS_SCSI_TGT, *p); /* find SCSI disk device paths */ glob_t devs; glob(tgtbuf, 0, 0, &devs); if(devs.gl_pathc > 0) { char **ptr; int c; for(ptr = devs.gl_pathv, c = devs.gl_pathc; c; ptr++, c--) { printf("We would now call mount(2) for /dev/%s.\n", basename(*ptr)); } } globfree(&devs); } globfree(&hosts); } } } 

最后要说明的是:从编程风格的角度来看,这很可能不是最好的例子。