最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux如何使用libudev獲取USB設(shè)備VID及PID

 更新時(shí)間:2020年09月11日 09:50:19   作者:陌鉎こ城sHi  
這篇文章主要介紹了Linux如何使用libudev獲取USB設(shè)備VID及PID,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

在本文將使用libudev庫來訪問hidraw的設(shè)備。通過libudev庫,我們可以查詢設(shè)備的廠家ID(Vendor ID, VID),產(chǎn)品ID(Product ID, PID),序列號和設(shè)備字符串等而不需要打開設(shè)備。進(jìn)一步,libudev可以告訴我們在/dev目錄下設(shè)備節(jié)點(diǎn)的具體位置路徑,為應(yīng)用程序提供一種具有足夠魯棒性而又和系統(tǒng)廠家獨(dú)立的訪問設(shè)備的方式。使用libudev庫,需要包含libudev.h頭文件,并且在編譯時(shí)加上-ludev告訴編譯器去鏈接udev庫。

將列出當(dāng)前連接在系統(tǒng)中的所有hidraw設(shè)備,并且輸出它們的設(shè)備節(jié)點(diǎn)路徑、生產(chǎn)商、序列號等信息。

為了獲取這些信息,需要?jiǎng)?chuàng)建一個(gè)udev_enumerate對象,其中“hidraw”字符串作為過濾條件,

libudev將返回所有匹配這個(gè)過濾字符串的udev_device對象。

這個(gè)列子的步驟如下:

1、 初始化庫,獲取一個(gè)struct udev句柄

2、枚舉設(shè)備

3、對找到的匹配設(shè)備輸出它的節(jié)點(diǎn)名稱,找到實(shí)際USB設(shè)備的起始節(jié)點(diǎn),打印出USB設(shè)備的IDs和序列號等,最后解引用設(shè)備對象

4、解引用枚舉對象

5、解引用udev對象

具體代碼如下:

#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>

int main (void)
{
  struct udev *udev;
  struct udev_enumerate *enumerate;
  struct udev_list_entry *devices, *dev_list_entry;
  struct udev_device *dev;

  /* Create the udev object */
  udev = udev_new();
  if (!udev) {
    printf("Can't create udev\n");
    exit(1);
  }

  /* Create a list of the devices in the 'hidraw' subsystem. */
  enumerate = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(enumerate, "hidraw");
  udev_enumerate_scan_devices(enumerate);
  devices = udev_enumerate_get_list_entry(enumerate);
  /* For each item enumerated, print out its information.
    udev_list_entry_foreach is a macro which expands to
    a loop. The loop will be executed for each member in
    devices, setting dev_list_entry to a list entry
    which contains the device's path in /sys. */
  udev_list_entry_foreach(dev_list_entry, devices) {
    const char *path;

    /* Get the filename of the /sys entry for the device
      and create a udev_device object (dev) representing it */
    path = udev_list_entry_get_name(dev_list_entry);
    dev = udev_device_new_from_syspath(udev, path);

    /* usb_device_get_devnode() returns the path to the device node
      itself in /dev. */
    printf("Device Node Path: %s\n", udev_device_get_devnode(dev));

    /* The device pointed to by dev contains information about
      the hidraw device. In order to get information about the
      USB device, get the parent device with the
      subsystem/devtype pair of "usb"/"usb_device". This will
      be several levels up the tree, but the function will find
      it.*/
    dev = udev_device_get_parent_with_subsystem_devtype(
         dev,
         "usb",
         "usb_device");
    if (!dev) {
      printf("Unable to find parent usb device.");
      exit(1);
    }

    /* From here, we can call get_sysattr_value() for each file
      in the device's /sys entry. The strings passed into these
      functions (idProduct, idVendor, serial, etc.) correspond
      directly to the files in the directory which represents
      the USB device. Note that USB strings are Unicode, UCS2
      encoded, but the strings returned from
      udev_device_get_sysattr_value() are UTF-8 encoded. */
    printf(" VID/PID: %s %s\n",
        udev_device_get_sysattr_value(dev,"idVendor"),
        udev_device_get_sysattr_value(dev, "idProduct"));
    printf(" %s\n %s\n",
        udev_device_get_sysattr_value(dev,"manufacturer"),
        udev_device_get_sysattr_value(dev,"product"));
    printf(" serial: %s\n",
        udev_device_get_sysattr_value(dev, "serial"));
    udev_device_unref(dev);
  }
  /* Free the enumerator object */
  udev_enumerate_unref(enumerate);

  udev_unref(udev);

  return 0;
}

編譯程序:

gcc -Wall -g -o udev_example udev_example.c -ludev

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Apache訪問日志的配置與使用

    Apache訪問日志的配置與使用

    本文主要是在linux下設(shè)置apache的httpd.conf配置文件,實(shí)現(xiàn)記錄自己想要記錄的web訪問日志,如客戶機(jī)IP、連接的日期和時(shí)間、響應(yīng)請求的狀態(tài)代碼等等。
    2018-05-05
  • linux之硬鏈接和軟鏈接解讀

    linux之硬鏈接和軟鏈接解讀

    這篇文章主要介紹了linux之硬鏈接和軟鏈接的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Linux文件查找命令總結(jié)(下篇)

    Linux文件查找命令總結(jié)(下篇)

    這篇文章主要介紹了Linux文件查找命令總結(jié)(下篇),本文章內(nèi)容詳細(xì),通過案例可以更好的掌握文件查找的相關(guān)命令,本篇為下篇,需要的朋友可以參考下
    2023-01-01
  • Linux下nginx配置https協(xié)議訪問的方法

    Linux下nginx配置https協(xié)議訪問的方法

    這篇文章主要介紹了Linux下nginx配置https協(xié)議訪問的方法,需要的朋友可以參考下
    2016-07-07
  • 詳解Linux iptables 命令

    詳解Linux iptables 命令

    iptables 是 Linux 管理員用來設(shè)置 IPv4 數(shù)據(jù)包過濾條件和 NAT 的命令行工具。這篇文章較詳細(xì)的給大家介紹了Linux iptables 命令,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • 三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用

    三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用

    這篇文章主要介紹了三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用,感興趣的朋友可以參考一下
    2016-01-01
  • Centos7.5配置IP地址的實(shí)現(xiàn)

    Centos7.5配置IP地址的實(shí)現(xiàn)

    這篇文章主要介紹了Centos7.5配置IP地址的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 淺析Linux中crontab任務(wù)調(diào)度

    淺析Linux中crontab任務(wù)調(diào)度

    這篇文章主要介紹了Linux中crontab任務(wù)調(diào)度的相關(guān)知識,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • linux 安裝配置lamp v2

    linux 安裝配置lamp v2

    距離第一個(gè)版本已經(jīng)有一年了。修正了幾個(gè)錯(cuò)誤的地方,還有取消了某些lib的安裝,因?yàn)閏entos有,所以相關(guān)的lib安裝我都沒有去查找錯(cuò)誤。
    2009-02-02
  • Linux 相對路徑和絕對路徑的使用

    Linux 相對路徑和絕對路徑的使用

    這篇文章主要介紹了Linux 相對路徑和絕對路徑的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評論

长沙市| 新竹县| 霍林郭勒市| 新乐市| 河津市| 揭东县| 孝感市| 霍山县| 融水| 娄底市| 明光市| 沙雅县| 辽宁省| 孟津县| 通渭县| 大同县| 阿鲁科尔沁旗| 化德县| 九台市| 康平县| 博野县| 台中市| 永和县| 繁峙县| 大荔县| 黄冈市| 怀来县| 仪陇县| 浮梁县| 土默特右旗| 紫金县| 宁远县| 湾仔区| 夏河县| 东乡县| 尚志市| 渭南市| 平阳县| 拉萨市| 福建省| 临洮县|