做嵌入式
開發,尤其在閘道器
、路由器或者其他支援usb
裝置的終端上,為了提高使用者體驗,我們常常需要支援自動識別並掛載usb裝置功能。某些應用程式,在使用usb裝置的過程中,也希望能夠偵測到usb斷開事件,不至於某些工作因為usb已經不存在而白做。在linux
下,我們主要有兩種辦法檢測usb熱插拔。
第一種便是定時檢查/proc/scsi/scsi檔案,該檔案內會按照標準格式儲存著當前裝置內掛載的儲存介質基本資訊,如果在pc端,除了硬碟(ata)、光碟機(cd-rom)外,就是usb裝置(direct-access)了,輪詢該scsi檔案,檢查檔案內是否新增或減少資料便可實現自動偵測usb熱插拔的效果。但是這種方法對於熱插拔(hotplug)裝置,如u盤,效果就沒那麼理想了,因為我們不知道裝置什麼時候插上,又是什麼時候被拔掉了,只能驗證當前是否已經插上或者已經拔除的事實。於是便有了另一種辦法,我們採用一種特殊類的的檔案描述符
(套結字
)專門用於linux核心跟使用者空間之間的非同步通訊,這種技術通常被成為netlink。
由於netlink是linux內建功能,所以使用起來很簡單:建立乙個af_netlink協議族下netlink_kobject_uevent型別的特殊檔案描述符(套結字)cpplive,然後利用setsocketopt允許該檔案描述符(套結字)復用其他埠,再利用band函式
將自身程序繫結到特殊檔案描述符(套結字)cpplive,最後利用select在while迴圈內監聽cpplive是否可讀,如果可讀則呼叫recv接收linux系統核心傳遞過來的資料並列印出來,這些輸出便是usb熱插拔資訊。當然你也可以個性化地處理來自核心的熱插拔資訊,讓程式變得更加智慧型以及人性化。
利用netlink檢測usb熱插拔的c語言
實現**如下:
view plain
copy to clipboard
print?
#include
#include
#include
#include
#include
#include
#define uevent_buffer_size 2048
int main(void)
; fd_zero(&fds);
fd_set(cpplive, &fds);
tv.tv_sec = 0;
tv.tv_usec = 100 * 1000;
ret = select(cpplive + 1, &fds, null, null, &tv);
if(ret < 0)
continue;
if(!(ret > 0 && fd_isset(cpplive, &fds)))
continue;
/* receive data */
rcvlen = recv(cpplive, &buf, sizeof(buf), 0);
if (rcvlen > 0)
} close(cpplive);
return 0;
}
執行程式,測試u盤插入/拔除,輸出如下:
view plain
copy to clipboard
print?
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0
add@/module/usb_storage
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/scsi_host/host6
add@/bus/usb/drivers/usb-storage
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg2
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0
change@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb
add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb4
add@/devices/virtual/bdi/8:16
add@/module/fat
add@/kernel/slab/fat_cache
add@/kernel/slab/fat_inode_cache
add@/module/vfat
add@/module/nls_cp437
add@/module/nls_iso8859_1
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg2
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb4
remove@/devices/virtual/bdi/8:16
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/scsi_host/host6
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0
remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1
remove@/host6/target6:0:0
**
Linux下自動檢測USB熱插拔
做嵌入式 開發,尤其在閘道器 路由器或者其他支援usb 裝置的終端上,為了提高使用者體驗,我們常常需要支援自動識別並掛載usb裝置功能。某些應用程式,在使用usb裝置的過程中,也希望能夠偵測到usb斷開事件,不至於某些工作因為usb已經不存在而白做。在linux 下,我們主要有兩種辦法檢測usb熱插...
shell自動檢測
列印選單,讓使用者選擇,並根據選擇執行操作 如果使用者選擇的是a,顯示cpu資訊 如果使用者選擇的是b,顯示記憶體資訊 如果使用者選擇的是c,執行緒磁碟資訊 如果使用者選擇的是d,顯示網路io資訊 使用者使用者選擇的是e,退出系統 如果使用者選擇成其他選擇,提示輸入錯誤,讓使用者重新選擇 bin b...
spring 自動檢測bean
當在spring配置中增加時,我們希望spring特殊對待我們所定義的bean裡的某一組註解,並使用這些註解指導bean裝配。即使有助於完全消除spring配置中的和元素,我們仍需要使用元素顯示定義bean。但是spring還有另一種技巧。元素除了完成與一樣的工作,還允許spring自動檢測bean...