玩linux 也有一段时间啦。。想区分linux下某一设备是否为usb设备。。google了一段时间,,

ioctl   没有找到
判断拔出,插入的也有些例子可看,,但是假如,知道 一个名为: /dev/sda 的分区,如何根据分区名判断这个设备是不是usb设备。。网上有读/proc的。在我用的Ubuntu 10.04中看,没有/dev/sda对应的相关信息。。

最后根据udev 实现一个比较山寨的函数,,

代码:
bool is_usb_device(char * devpath)
{
  struct stat buf;
  char link[512] = {0};
  char link_path[512]={0};
  if(lstat(devpath,&buf) < 0)
  {
    return false;
  }  
  printf("dev %d,%d,\n",major(buf.st_dev),minor(buf.st_dev));
  if( S_ISBLK(buf.st_mode))
  {
    sprintf(link_path,"/sys/dev/block  /%d:%d",major(buf.st_rdev),minor(buf.st_rdev));
    if( access(link_path,F_OK) >= 0  )
    {
      int i = readlink(link_path,link,512);
      if(i == 0 ) return false;
      string strlink = link;
      int pos = strlink.find("usb",0);
      if(pos == string::npos) return false;
      return true;     

    }  

  }  
  
  return false;

}

大家有什么其它好方法的。欢迎分享和讨论。。。

devfs、sysfs、udev介绍
一、devfs

linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。

在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道 /dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。

二、sysfs

正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。用户空间的工具udev 就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,而devfs却运行在内核空间,而且udev不存在 devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。

The top level sysfs directory looks like:
block/
bus/
class/
devices/
firmware/
net/
fs/

devices/ contains a filesystem representation of the device tree. It maps
directly to the internal kernel device tree, which is a hierarchy of
struct device.

bus/ contains flat directory layout of the various bus types in the
kernel. Each bus's directory contains two subdirectories:
       devices/
       drivers/
devices/ contains symlinks for each device discovered in the system
that point to the device's directory under root/.

drivers/ contains a directory for each device driver that is loaded
for devices on that particular bus (this assumes that drivers do not
span multiple bus types).

fs/ contains a directory for some filesystems. Currently each
filesystem wanting to export attributes must create its own hierarchy
below fs/ (see ./fuse.txt for an example).

三、udev

udev是一种工具,它能够根据系统中的硬件设备的状况动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下,使用udev 后,在/dev下面只包含系统中真实存在的设备。它于硬件平台无关的,位于用户空间,需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间。