gpt4 book ai didi

c - Linux下C中如何判断U盘(U盘) 'device path'

转载 作者:太空狗 更新时间:2023-10-29 12:04:24 25 4
gpt4 key购买 nike

如何在 Linux 下使用 C 以编程方式枚举所有 USB 存储器?我想获取诸如 '/dev/sdb4' 之类的字符串,以便我可以使用 mount() 来挂载它们。

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

另外,我们能否区分U盘(直接插入机器的USB接口(interface))和U盘(通常通过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);
}
}
}

最后一点:就一般的编码风格而言,这很可能不是最好的学习示例。

关于c - Linux下C中如何判断U盘(U盘) 'device path',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20397683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com